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++系列

全部评论

相关推荐

10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务