static
类和结构体外部的static
对.cpp
如果是在类或者struct的外部的static,则意味着该static变量或函数的可见范围只在该文件内,该static变量或函数在编译时对其他文件的代码是不可见的,类似于类的私有成员,static就是该文件的私有成员
对.h
对于头文件里声明的static,因为被包含的头文件在编译的时候对应的代码段是直接插入对应的.cpp文件的,实际上就相当于是在.cpp文件里面直接定义的static
所以如果希望使用的变量或者函数不是全局可见的,就应该使用static,来避免其他地方函数和变量命名的困扰
类和结构体内部的static
类中的static变量
类的所有实例共享这同一个static变量,如果其中一个实例对static变量进行了改变,这种改变将反映到其他所有的实例,实际上你可以直接通过类名来引用和初始化static变量,而不用通过任何一个该类的对象如:
Entity::x = 5;//将Entity类中的静态变量x初始化为5
类中的static方法
类中的静态方法无法访问类的实例,它可以被调用,但是在其内部,你不能直接引用该类的任何实例中的成员,除非在参数中传入对应的成员或直接传入对应的实例,实际上类内的非static成员函数在编译时会自动传入一个隐藏的参数,这个参数告诉编译器该成员函数要作用的是哪一个实例,而static成员函数在编译时就不会收到这样一个隐藏的参数,因此不知道你要作用的是哪一个实例,只有当你在参数里面传入具体的实例的时候才可以运行
local static
局部静态变量的特点是生存时间是整个程序运行的时间,但是作用域依然只在声明该变量的语句所在的局部,例如:
void func()
{
int i = 0;//该局部变量i不是静态变量,因此寿命随着函数调用结束而终结,
//每次调用的时候重新被声明
i++;
std::cout << i << std::endl;
}
int main()
{
func();//输出1
func();//输出1
func();//输出1
return 0;
}
而如果func()内的变量i是静态变量
void func()
{
static int i = 0;//静态变量在函数调用结束后没有被销毁,而是保存下来直到程序整体结束,
//但是在函数外部无法访问该局部变量
i++;
std::cout << i << std::endl;
}
int main()
{
func();//输出1
func();//输出2
func();//输出3
return 0;
}
内容来自YouTube上Cherno大佬的C++系列