http://my.oschina.net/hnuweiwei/blog/284467
static关键字详解:
面向过程
静态局部变量
在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)
在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区) #include <cstdlib> #include <iostream> using namespace std; void counter() { static int count = 0; ++count; cout<<count<<" time called!"<<endl; } int main(int argc, char *argv[]) { counter(); counter(); counter(); counter(); system("PAUSE"); return EXIT_SUCCESS; } output: 1 time called! 2 time called! //因为值没有变化,所以下次计数会按照上次的运行结果的值 3 time called! //如果不加static,每次调用,都是重新赋值为0,所以加了static,变量存储在静态区 4 time called!
静态全局变量
在模块内,在函数体外,一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问,它是一个本地的全局变量
静态函数
在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,这个函数被限制在声明它的模块的本地范围内使用
面向对象
静态数据成员
在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见
初始化:静态数据成员必须初始化,并且只能在类外初始化;由于静态数据成员不属于某一个对象,因此不能通过构造函数的方式初始化静态数据成员
静态函数成员
在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静态数据成员
1 #include <iostream> 2 using namespace std; 3 class teststatic { 4 private: 5 static int a; //静态数据成员 6 static const int aconst = 10; 7 int b; 8 public: 9 teststatic() {} 10 teststatic(int btemp) { 11 b = btemp; 12 } 13 static int geta() { //静态函数成员 14 ++a; 15 return a; 16 } 17 18 }; 19 int teststatic::a = 100; //静态数据成员必须初始化,并且只能在类外初始化 20 int main(int argc, char * argv[]) { 21 teststatic test1; 22 cout << teststatic::geta() << endl; 23 cout << test1.geta() << endl; 24 system("pause"); 25 return EXIT_SUCCESS; 26 }
static存储
static优势:可以节省内存,因为它是所有对象所公有的,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。