static的学习——CPP
作用
- 延长生命周期
- 限制作用域
- 唯一性
修饰局部变量
存储区域
static在修饰局部变量时,被修饰的变量存储在静态存储区(与之对应的非静态局部变量则存储在栈中,栈的分配比静态存储区快)。
生命周期
局部静态变量,即便在退出所在函数之后也不会被销毁。
- 在main()之前static变量已经被初始化;
- 由系统在程序退出时销毁;
修饰全局变量
限制作用域
对于全局变量,由于全局变量本身就是存储在静态存储区;但是static会限制了它的连接属性。
打个比方:
假如在头文件中定义了一个全局变量;而一旦这个全局变量被两个.cpp文件include进来了,那么回发送重定义的错误。
这时有两个解决办法:一个是上一次提到过的使用extern,而另一个则是使用static去修饰定义。由于static全局变量只能被包含它的文件定义,也就是说,static修饰的全局变量是不能被其它文件(非包含该变量的文件)访问,这时两个.cpp中static是不一样的。
修饰函数
- 对于静态函数,定义和声明要放在一起,不能一个在头文件中,另一个在.cpp文件中。因此,在多人合作的项目中,可以定义static函数,避免冲突。
与C的不同
由于CPP类的出现,如果类中定义static的成员变量和函数,那么所有对象都共享一个实例。