static关键字(超全总结)
C语言中:
静态变量
- 全局区域分配内存
- 未经初始化的变量自动初始化为0
- 静态全局变量只在声明它的整个文件可见,文件外不可见(其它文件可以继续定义被声明为static的变量相同的名字)
静态函数
- 同静态全局变量,对其它文件不可见,其它文件可以定义相同的函数名字,不会发生冲突
C++中:
类的静态成员变量
-
类中所有对象所共有的,只分配一次内存
-
在全局区分配内存,不占用对象的内存,sizeof不计算静态成员变量
#include <iostream> using namespace std; class A { public: private: int a; static int b; }; int main(int argc, char **argv) { A a; cout << "sizeof a = " << sizeof(a) << endl; return 0; } 输出: sizeof a = 4
-
类的静态成员变量不能在初始化列表里初始化,也不能在声明的时候初始化,只能在类外初始化
class A { public: A() : a(5) /* , b(2) */ {} // error: ‘int A::b’ is a static data member; it can only be initialized at its definition private: int a = 1; static int b; /* static int b = 2; error: ISO C++ forbids in-class initialization of non-const static member ‘A::b’ */ }; int A::b = 2; // 正确
-
静态成员变量属于声明的类,不属于某个对象,所以既可以采用对象方式访问,也可以采用类名加::的方式访问
A a; cout << "b = " << a.b << endl; cout << "b = " << A::b << endl;
-
静态数据成员和普通函数一样遵循public、protected、private访问规则
类的静态成员函数
- 静态成员函数是为类服务,不是为某一个对象,在类的内部实现,属于类的一部分
- 与普通函数相比,静态成员函数属于类本身,不属于对象,它不具有this指针,所以无法访问类内非静态的成员函数与非静态的成员变量,只能访问其它的静态成员函数与静态成员变量
- 非静态成员函数能访问类中其它静态成员变量与静态成员函数,静态成员在类中全局共享
- 静态成员函数还可以通过作用域限定符的方式调用
静态数据成员与全局变量对比
- 静态成员变量没有进入程序的全局命名空间,所以不会与程序中其它全局命名冲突
- 静态数据成员可以实现信息的隐藏,它可以是private成员,但是全局变量不可以