c/c++中static关键字的作用

static在C里面可以用来修饰变量,也可以用来修饰函数。

1.static局部变量

a.生存周期:静态局部变量在函数内定义,生存期为整个源程序;

b.存储方式:当用static修饰时,从原来的栈中存放改为静态存储区;

c.作用域:与自动变量相同,只能在定义该变量的函数内使用,退出该函数后,尽管该变量还继续存在,但不能使用它;

d.初始化:对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值,而对自动变量不赋初值,则其值是不定的。

2.static全局变量

a.存储方式:全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式;

b.作用域:非静态全局变量的作用域是整个源程序(多个源文件可以共同使用),而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效。

3.static函数

只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) 。


静态类成员:是那些与类本身有关的成员数据和成员函数,而不是与该类对象相关的成员数据和成员函数。

所以静态成员数据也称为类数据,静态成员函数也称为类方法。静态成员数据在类里只是一个说明,还需要一个定义(或叫初始化)。静态成员数据要在类定义之外被初始化(要用类名限定修饰),而且程序里只能提供一次,所以初始化不能放在头文件里。

例1:

  1. class Test{ 
  2. public
  3.     static int k; 
  4.     Test(int a):k(a){   
  5.  
  6.     } 
  7. }; 
  8. //error: 'int Test::k' is a static data member; it can only be initialized at its definition 

例2:

C++规定const静态类成员可以直接初始化,其他非const的静态类成员需要在类声明以外初始化,我们一般选择在类的实现文件中初始化。

int Test::k; 

默认初始化为0;

也可自己指定:

int Test::k(20); 

  1. class Test{ 
  2. public
  3.     static const int a = 10;   
  4.     static int k; 
  5. }; 
  6.  
  7. int Test::k; 
  8.  
  9. int main(){ 
  10.     cout << Test::k << endl; 
  11.     cout << Test::a; 
  12.     return 0; 

•在inline函数里不要使用静态成员数据,因为编译器不能保证此时静态成员数据已初始化。

  1. class Test{ 
  2. public
  3.     static const int a = 10; 
  4.     static int k; 
  5.     void f(){ 
  6.         k++; 
  7.     } 
  8. }; 
  9. int Test::k(20); 
  10. int main(){ 
  11.     Test t; 
  12.     t.f(); 
  13.     cout << Test::k; 
  14.     return 0; 

•静态成员数据与全局变量的比较:静态成员数据不论类由多少实例,它都只有一个拷贝,这和全局变量类似。但静态成员数据有个作用域名字,而且不一定是public的。

•静态成员函数不能声明为const和volatile。

•静态成员函数和友元函数比较:静态成员函数和友元函数都没有隐含的this指针,且都能访问类的private和protected部分。但静态成员函数有个作用域名字,而且不一定是public的。

•const静态成员数据:在有些C++编译器里,有序型的(如int,unsignedlong,char等)const静态成员数据可以

在类里对其初始化。

•静态成员数据初始化次序:静态初始化成员数据次序和类作用域的静态对象、文件作用域和名字空间作用域的对象的生存周期有关。当在不同编译单元(即.cpp文件)的静态初始化有次序依赖,这就有可能有危险。解决的办法将静态成员数据转换为静态成员函数。

•volatile:当一个对象的值可能会在编译器的控制或监视之外被改变,那该对象应该声明为volatile。 此时编译器执行的一些例行优化对它不能应用。volatile也可以修饰类成员函数。对于volatile类对象它只能调用volatile成员函数、构造函数和析构函数。


转自:http://www.linuxidc.com/Linux/2013-08/89340.htm

           http://www.linuxidc.com/Linux/2012-11/73477.htm


你可能感兴趣的:(C/C++)