设为首页 加入收藏

TOP

C++之static静态修饰符详解
2013-01-09 13:42:43 来源: 作者: 【 】 浏览:328
Tags:static 静态 修饰 详解

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

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

  例1:

  [cpp]

  class Test{

  public:

  static int k;

  Test(int a):k(a){  //编译错误!!!

  }

  };

  [cpp]

  //error: 'int Test::k' is a static data member; it can only be initialized at its definition

  例2:

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

  [cpp]

  int Test::k;

  默认初始化为0;

  也可自己指定:

  [cpp]

  int Test::k(20);

  [cpp] view plaincopy

  class Test{

  public:

  static const int a = 10;

  static int k;

  };

  int Test::k;

  int main(){

  cout 《 Test::k 《 endl;

  cout 《 Test::a;

  return 0;

  }

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

  [cpp]

  class Test{

  public:

  static const int a = 10;

  static int k;

  void f(){

  k++;

  }

  };

  int Test::k(20);

  int main(){

  Test t;

  t.f();

  cout 《 Test::k;

  return 0;

  }

  [cpp]

  class A{

  public:

  A(A & e):_e3(e){}

  A & _e3;

  A * _e1;

  static A _e;

  A _e2;  // error C2460: '_e2' : uses 'A', which is being defined

  };

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

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

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

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

  在类里对其初始化。

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

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇拓展KMP求前缀回文串 下一篇动态规划和暴力法解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: