静态局部变量
在局部变量前加上“static”关键字,就成了静态局部变量。
静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其初始化为0。
原文链接:https://blog.csdn.net/pjh88/article/details/112303283
如果不适用静态局部作用域(local static scope)来创建一个单例类,那么创建某种静态的单例实例
#include <iostream>
class Singleton //单例类——这个类只有一个实例存在
{
private:
static Singleton* s_Instance; //创建某种静态的单例实例
public: //返回一个引用
static Singleton& Get() { return *s_Instance; }; //返回引用类型的Get静态方法 返回解引用后的实例
void Hello() {}
};
Singleton* Singleton::s_Instance = nullptr;//全局声明这个实例 缺省设为nullptr
int main()
{
Singleton::Get().Hello();
std::cin.get();
}
效果相同
#include <iostream>
class Singleton
{
public:
static Singleton& Get()
{
static Singleton instance;
return instance;
}
void Hello() {}
};
int main()
{
Singleton::Get().Hello();
std::cin.get();
}
枚举(enums)
enums就是一些值的集合,就是给特定值命名的一种方式,这样就不用到处处理各种整型数据了,
定义枚举类型的主要目的:增加程序的可读性。
enum 是 C++ 关键字,所以它必须小写,
数据类型本身的名字是以大写字母开头的。
(虽然这并非必须,但是绝大多数程序员都会釆用首字母大写的形式。)
enum Eaxample : unsigned char //只能用整型,不能用float
{
A = 5, B, C
};
默认情况下,编译器设置第一个枚举量为 0,下一个为 1,以此类推。
在上述示例中,A的值将是 5,B 的值为 6,等等。
#include <iostream>
class Log
{
public:
enum Level //通过设置Level类型来限制你的代码,只允许设置为Level的枚举值
{
LoglevelError = 0, LoglevelWarning, LoglevelInfo
};
private: //私有变量成员,代表设置的log级别
Level m_Loglevel = LoglevelInfo;//m前缀一般表明这是一个私有的类成员变量
public:
void SetLevel(Level level) //通过设置Level类型来限制你的代码
{
m_Loglevel = level;
}
void Error(const char* message) //打印信息到控制台
{
if (m_Loglevel >= LoglevelError)
std::cout << "[ERROR]: " << message << std::endl;
}
void Warn(const char* message) //打印信息到控制台
{
if (m_Loglevel >= LoglevelWarning)
std::cout << "[WARNING]: " << message << std::endl;
}
void Info(const char* message)
//Warn函数有一个字符串指针,使我们要打印的消息
//const char*——字符串
{
if (m_Loglevel >= LoglevelInfo)
std::cout << "[INFO]: " << message << std::endl;
}
};
int main()
{
Log log;
log.SetLevel(Log::LoglevelError); //log.LoglevelWarning这是一个整数,现在改成log::LoglevelError
//因为LoglevelError的枚举值是在Log类命名空间,而枚举类型Level本身不是一个命名空间
log.Warn("Hello!");
log.Error("Hello!");
log.Info("Hello!");
std::cin.get();
}
构造函数
构造函数是一种特殊方法,它在类每次实例化的时候运行
#include <iostream>
class Entity
{
public:
float X, Y; //用来表示Entity的位置
void Print()
{
std::cout << X << "," << Y << std::endl;
}
};
int main()
{
Entity e;
e.Print();
std::cin.get();
}
我们需要在我们创建Entity实例的时候就自动把X和Y设置为0,除非我们显示设置为其他值
#include <iostream>
class Entity
{
public:
float X, Y; //用来表示Entity的位置
Entity() //Entity的构造函数,不用再调用e.Init()函数
{
X = 0.0f;
Y = 0.0f;
}
void Print()
{
std::cout << X << "," << Y << std::endl;
}
};
int main()
{
Entity e;
e.Print();
std::cin.get();
}
在c++中,必须手动初始化所有的基本类型,不然,机会吧设置为之前保留在内存中的值
函数重载——相同函数名有不同的参数不同版本函数
Entity() //Entity的构造函数,不用再调用e.Init()函数
{
X = 0.0f;
Y = 0.0f;
}
Entity(float x, float y)
{
X = x;
Y = y;
}