Post

static

static 在变量和函数中的使用

局部变量

默认情况下,变量的存储位置是栈,作用域是局部作用域,生命周期就是在作用域内,作用域结束就销毁。

static 修饰后,变量的存储位置变成了静态区,作用域没有变化,还是局部作用域,但是,初次调用到函数完成初始化,生命周期被延长,一直持续到程序结束,离开作用域并不会被销毁,后面再调用到该函数时,变量还是那个值,这叫 “可重入性”。

全局变量

默认情况下,全局变量存储位置是静态区,作用域是整个程序,生命周期也和程序的生命周期相同。

static 修饰后,存储位置和生命周期都不变,但作用域或者说可见性,被限制在当前文件,其它文件无法访问,这叫 “隐藏性”,或者说 “隔离作用”。

函数

同样的,用 static 修饰函数,和修饰全局变量相似,也只是将函数的作用域或可见性,从整个程序变成仅当前文件。

static 在类内的使用

数据成员

static 修饰的数据成员,即静态成员,不关联到任何对象,不占用对象内存空间,即使没有实例化任何对象,也可以用类命名空间访问,任何对象也都可以访问同一个静态成员。

静态成员的生命周期是整个程序,存储在全局/静态区,一般来说,需要在类外对静态成员初始化,这会在程序启动时进行。

成员函数

static 修饰成员函数,即静态成员函数,也是不关联到任何对象,调用静态成员函数的时候,没有 this 指针,没有实例化任何对象的时候,也可以用类命名空间调用。

静态成员函数不能用 virtualconstvolatile 修饰,因为不关联任何对象。

静态成员函数只能访问静态成员和静态成员函数,不能访问普通数据成员和普通成员函数。

总结

  1. static 修饰的变量存储在静态区,生命周期延长到程序运行结束。
  2. static 具有隐藏或隔离作用,用 static 修饰的全局变量和全局函数作用域都会从整个程序(也就是全局)变成当前文件。
  3. 静态成员虽然有和程序一样的生命周期(全局生命周期),但作用域任然只在自己的作用域。
  4. 类中普通静态成员不能再类内初始化,需要在类外初始化,除了内联成员可以在类内初始化(C++17)。
  5. 静态成员函数只能调用静态成员,不能调用非静态成员,这里包括数据成员和成员函数。
This post is licensed under CC BY 4.0 by the author.