一,面向过程的static
函数中的静态变量 :当变量声明为static时,空间将在程序的生命周期内分配,其被存放在在全局数据区。即使多次调用该函数,静态变量的空间也只分配一次,前一次调用中的变量值通过下一次函数调用传递。这对于在C / C ++或需要存储先前函数状态的任何其他应用程序非常有用。
例如 :
1 #include <iostream> 2 using namespace std; 3 4 void func() { 5 static int i = 0; 6 cout << "i = " << ++i << endl; 7 } 8 9 void main() 10 { 11 for (int x = 0; x < 10; x++) 12 func(); 13 }
会输出1到10的数,如果不用static,则会输出10次1
二,面向对象的static
- 类中的静态变量 声明为static的变量只被初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量由对象共享,可以减小对象的大小。对于不同的对象,不能有相同静态变量的多个副本。也是因为这个原因,静态变量不能使用构造函数初始化。
注意:类中的静态成员变量必须在类内声明,在类外定义(被const修饰的除外).
1 class Apple 2 { 3 public: 4 static int i; // 类内声明 5 6 Apple() 7 { 8 // Do nothing 9 }; 10 }; 11 12 int Apple::i = 1; // 类内定义 13 class Apple 14 { 15 public: 16 // 被const修饰的static变量在c++11中可以在类内被直接初始化。 17 static const int i=10; 18 Apple() 19 { 20 // Do nothing 21 }; 22 };
2. 类中的静态成员函数 :静态成员函数也不依赖于类的对象。我们被允许使用对象和'.'来调用静态成员函数。但建议使用类名和范围解析运算符调用静态成员。静态成员函数仅能访问静态数据成员或其他静态成员函数,它们无法访问类的非静态数据成员或成员函数。
3. 静态类 :和变量一样,静态类的生命周期直到程序的结束。在main结束后才会调用静态类的析构函数。
转自: https://zhuanlan.zhihu.com/p/152046509