场景:
1. static 修复符具有静态共享特性, 在C/C++里一般用来作为共享变量使用,或者节约内存声明的常量或不改变大小的存储区.
2. static活用的话也可以作为单例模式的便捷方式.
3. 总的说来static是文件范围内可见的,或类,函数范围内可见的. 注意: 非全局可见的.
4. 注意, 文件范围内可见的static(一种是文件内声明的静态变量,一种是类静态成员变量)会在main执行前先执行, 如果是类, 那么会调用构造函数, 如果是原始类型, 会初始化为0.
下边是对static关键字的详细说明,参考:
https://msdn.microsoft.com/en-us/library/y5f6w579.aspx
https://msdn.microsoft.com/zh-cn/cn-zh/library/y5f6w579.aspx
static 关键字可用于在全局范围、命名空间范围和类范围声明变量和函数。 静态变量还可在本地范围声明。 静态持续时间意味着,在程序启动时分配对象或变量,并在程序结束时释放对象或变量。 外部链接意味着,变量的名称在用于声明变量的文件的外部是可见的。 相反,内部链接意味着,名称在用于声明变量的文件的外部是不可见的。 默认情况下,在全局命名空间中定义的对象或变量具有静态持续时间和外部链接。 在以下情况下,可使用 static 关键字。 在文件范围(全局和/或命名空间范围)内声明变量或函数时,static 关键字将指定变量或函数具有内部链接。 在声明变量时,变量具有静态持续时间,并且除非您指定另一个值,否则编译器会将变量初始化为 0。 在函数中声明变量时,static 关键字将指定变量将在对该函数的调用中保持其状态。 在类声明中声明数据成员时,static 关键字将指定类的所有实例共享该成员的一个副本。 必须在文件范围内定义静态数据成员。 声明为 conststatic 的整型数据成员可以有初始值设定项。 在类声明中声明成员函数时,static 关键字将指定类的所有实例共享该函数。 由于函数没有隐式 this 指针,因此静态成员函数不能访问实例成员。 若要访问实例成员,请使用作为实例指针或引用的参数来声明函数。 不能将联合成员声明为静态的。 但是,全局声明的匿名联合必须是显式声明的 static。
从 C++11 开始,可以保证静态本地变量初始化是线程安全的。 此功能有时称为神奇的静态对象。 但是,在多线程应用程序中,必须同步所有后续分配。 可以通过使用 /Zc:threadSafeInit- 标志避免对 CRT 形成依赖,来禁用线程安全的静态对象功能。
#include <iostream> #include <stdlib.h> #include <vector> // 5.全局声明的匿名联合必须是显式声明的 static。g++貌似不用显示static union { int i; char j[4]; int k; }tt; class A { public: A(int i) { std::cout << "A:" << i << " Object Count: " << ++count_ << std::endl; } ~A(){} // 3.在类声明中声明数据成员时,static 关键字将指定类的所有实例共享该成员的一个副本。 static int count_; // 3.声明为 conststatic 的整型数据成员可以有初始值设定项 static const int index_ = 0; // 在类声明中声明成员函数时,static 关键字将指定类的所有实例共享该函数。 // 由于函数没有隐式 this 指针,因此静态成员函数不能访问实例成员。 // 若要访问实例成员,请使用作为实例指针或引用的参数来声明函数。 static void Log(A* a1,A& a2) { a1->Print(); a2.Print(); } void Print() { // 2.在函数中声明变量时,static 关键字将指定变量将在对该函数的调用中保持其状态。 static int i = 0; std::cout << "i: " << ++i << std::endl; } union YY { //static int i; 错误. 5.不能将联合成员声明为静态的 int i; char j[4]; int k; }yy; }; // 3.必须在文件范围内定义静态数据成员。根据条款1,初始化为0. int A::count_; // 1.在文件范围(全局和/或命名空间范围)内声明变量或函数时,static 关键字将指定变量或函数具有内部链接。 // 在声明变量时,变量具有静态持续时间,并且除非您指定另一个值,否则编译器会将变量初始化为 0。 static A a1(1); // 初始化为0. static int gNum; // 非static,具有静态持续时间和外部链接特性. A a2(2); int main(int argc, char const *argv[]) { std::cout << "begin main" << std::endl; // 使用C++11特性的auto自动转换类型. auto arr = new std::vector<int>(); a1.Print(); a2.Print(); A::Log(&a1,a2); //int integer = A::ut.i; std::cout << "tt.i: " << tt.i << std::endl; std::cout << "a1::yy.i: " << a1.yy.i << std::endl; std::cout << "end main" << std::endl; return 0; }
A:1 Object Count: 1 A:2 Object Count: 2 begin main i: 1 i: 2 i: 3 i: 4 tt.i: 0 a1::yy.i: 0 end main
原文:http://blog.csdn.net/infoworld/article/details/50270135