static的学习——CPP

static的学习——CPP

作用

  1. 延长生命周期
  2. 限制作用域
  3. 唯一性

修饰局部变量

存储区域

static在修饰局部变量时,被修饰的变量存储在静态存储区(与之对应的非静态局部变量则存储在栈中,栈的分配比静态存储区快)。

生命周期

局部静态变量,即便在退出所在函数之后也不会被销毁。

  • 在main()之前static变量已经被初始化;
  • 由系统在程序退出时销毁;

修饰全局变量

限制作用域

对于全局变量,由于全局变量本身就是存储在静态存储区;但是static会限制了它的连接属性。

打个比方:

假如在头文件中定义了一个全局变量;而一旦这个全局变量被两个.cpp文件include进来了,那么回发送重定义的错误。

这时有两个解决办法:一个是上一次提到过的使用extern,而另一个则是使用static去修饰定义。由于static全局变量只能被包含它的文件定义,也就是说,static修饰的全局变量是不能被其它文件(非包含该变量的文件)访问,这时两个.cpp中static是不一样的。

修饰函数

  • 对于静态函数,定义和声明要放在一起,不能一个在头文件中,另一个在.cpp文件中。因此,在多人合作的项目中,可以定义static函数,避免冲突。

与C的不同

由于CPP类的出现,如果类中定义static的成员变量和函数,那么所有对象都共享一个实例。