static
static 在变量和函数中的使用
局部变量
默认情况下,变量的存储位置是栈,作用域是局部作用域,生命周期就是在作用域内,作用域结束就销毁。
用 static
修饰后,变量的存储位置变成了静态区,作用域没有变化,还是局部作用域,但是,初次调用到函数完成初始化,生命周期被延长,一直持续到程序结束,离开作用域并不会被销毁,后面再调用到该函数时,变量还是那个值,这叫 “可重入性”。
全局变量
默认情况下,全局变量存储位置是静态区,作用域是整个程序,生命周期也和程序的生命周期相同。
用 static
修饰后,存储位置和生命周期都不变,但作用域或者说可见性,被限制在当前文件,其它文件无法访问,这叫 “隐藏性”,或者说 “隔离作用”。
函数
同样的,用 static
修饰函数,和修饰全局变量相似,也只是将函数的作用域或可见性,从整个程序变成仅当前文件。
static 在类内的使用
数据成员
用 static
修饰的数据成员,即静态成员,不关联到任何对象,不占用对象内存空间,即使没有实例化任何对象,也可以用类命名空间访问,任何对象也都可以访问同一个静态成员。
静态成员的生命周期是整个程序,存储在全局/静态区,一般来说,需要在类外对静态成员初始化,这会在程序启动时进行。
成员函数
用 static
修饰成员函数,即静态成员函数,也是不关联到任何对象,调用静态成员函数的时候,没有 this
指针,没有实例化任何对象的时候,也可以用类命名空间调用。
静态成员函数不能用 virtual
、const
、volatile
修饰,因为不关联任何对象。
静态成员函数只能访问静态成员和静态成员函数,不能访问普通数据成员和普通成员函数。
总结
- 用
static
修饰的变量存储在静态区,生命周期延长到程序运行结束。 static
具有隐藏或隔离作用,用static
修饰的全局变量和全局函数作用域都会从整个程序(也就是全局)变成当前文件。- 静态成员虽然有和程序一样的生命周期(全局生命周期),但作用域任然只在自己的作用域。
- 类中普通静态成员不能再类内初始化,需要在类外初始化,除了内联成员可以在类内初始化(C++17)。
- 静态成员函数只能调用静态成员,不能调用非静态成员,这里包括数据成员和成员函数。
This post is licensed under CC BY 4.0 by the author.