C++ static关键字总结
面向过程设计中的static
静态全局变量
- 静态全局变量只能在本文件被使用,使用extern导出也没用。
- 其他文件可以有同名的变量,并不冲突。
静态局部变量
通常定义局部变量,出了这个函数的作用域后,变量就没用了,因为在栈上分配内存。假设我每次调用函数时都要处理一个变量,声明成全局变量可以实现,但是这个变量就不属于函数了。可以通过静态局部变量某个变量为函数所有,再次执行时还是之前的值。
void fn(){
static int n =0;
std::cout<< n <<std::endl;
n++;
}
- 静态局部变量在全局数据区分配内存
- 首次执行时初始化,后面再次调用不再进行初始化
静态函数
- 静态函数只能在本文件中被使用,不能被其他文件使用
- 其他文件可以定义同名函数,并不会冲突。
面向对象设计中的static
静态成员变量
class Test{
private:
static int a_; //声明
int b_;
};
Test::a_ = 10; //静态成员变量需要在类外初始化
- 静态成员变量为所有对象所共有,值可以更新。对于普通变量,每个对象都有一份自己的拷贝,而静态变量一共就一份。
- 静态成员变量在全局数据区分配内存,由本类的所有对象共享,所以不占用对象的内存。因此没有创建对象时,静态成员变量就已经存在了,可以通过 类名::静态成员变量 的方式来操作
- 静态成员变量和普通static变量一样,编译时分配内存,到程序结束的时候才释放内存。
- sizeof(Test)=4,sizeof不计算静态成员变量
静态成员函数
- 静态成员函数没有this指针,所以无法访问普通的成员变量和函数,只可以访问静态成员变量和静态成员函数
- 非静态函数全部都可以访问
...