C++ static关键字总结

面向过程设计中的static

静态全局变量

  1. 静态全局变量只能在本文件被使用,使用extern导出也没用。
  2. 其他文件可以有同名的变量,并不冲突。

静态局部变量

通常定义局部变量,出了这个函数的作用域后,变量就没用了,因为在栈上分配内存。假设我每次调用函数时都要处理一个变量,声明成全局变量可以实现,但是这个变量就不属于函数了。可以通过静态局部变量某个变量为函数所有,再次执行时还是之前的值。

void fn(){
	static int n =0;
	std::cout<< n <<std::endl;
	n++;
}
  1. 静态局部变量在全局数据区分配内存
  2. 首次执行时初始化,后面再次调用不再进行初始化

静态函数

  1. 静态函数只能在本文件中被使用,不能被其他文件使用
  2. 其他文件可以定义同名函数,并不会冲突。

面向对象设计中的static

静态成员变量

class Test{
private:
	static int a_;	//声明
	int b_;
};

Test::a_ = 10;	//静态成员变量需要在类外初始化
  1. 静态成员变量为所有对象所共有,值可以更新。对于普通变量,每个对象都有一份自己的拷贝,而静态变量一共就一份。
  2. 静态成员变量在全局数据区分配内存,由本类的所有对象共享,所以不占用对象的内存。因此没有创建对象时,静态成员变量就已经存在了,可以通过 类名::静态成员变量 的方式来操作
  3. 静态成员变量和普通static变量一样,编译时分配内存,到程序结束的时候才释放内存。
  4. sizeof(Test)=4,sizeof不计算静态成员变量

静态成员函数

  1. 静态成员函数没有this指针,所以无法访问普通的成员变量和函数,只可以访问静态成员变量和静态成员函数
  2. 非静态函数全部都可以访问

参考

  1. https://zhuanlan.zhihu.com/p/37439983

  2. C++ and C++11 class static member, double should use “constexpr” while int can be “const”, why? - Stack Overflow