有关静态成员

来源:互联网 发布:linux下安装psutil 编辑:程序博客网 时间:2024/05/16 19:44

 

     静态成员有一个特点:论创建了几个对象,程序都只创建一个静态成员变量副本.也就是说,类的所有共同对象共享一个静态成员。静态成员的一个应用是对象计数器。
     对于静态成员,可以在类声明之外使用单独语句来初始化:
               type CLASSNAME::staticMemberName = value;
     这是因为静态成员是单独存储的,而不是对象的组成部分。由于头文件有可能会被几个方法.cpp文件所包含,所以静态成员不能在类声明中初始化,不然就会有多个副本,从而引起错误。
     如果静态成员是整形或是枚举型const,则可以在类声明中初始化。

     在使用静态成员进行计数的时候,有一个很重要的问题需要注意。
     看下面的代码:
      
Output:
     Constructor working... 

     1 books here...
     Constructor working...
     2 books here...
     main() ends here...
     Destructor working...
     1 books left...
     Destructor working...
     0 books left...
     Destructor working...
     -1 books left...
     Press any key to continue

     ------------------------------------------------
     为什么会有-1本书留下呢?肯定在某个地方,程序调用构造函数的时候并没有进行counter的递加操作,而反而在调用析构函数的时候进行了counter的递减。这涉及到一个构造函数的问题。由于class中没有提供复制构造函数,系统在执行“book book3 = book1;”的时候调用了系统默认的复制构造函数,而系统调用的默认复制构造函数属于浅复制。
     默认复制构造函数有以下原型:
          CLASSNAME::CLASSNAME( CLASSNAME& another )
          {
               another.dataMember1;
               another.dataMember2;
                    .
                    .
               another.dataMemberN;
          }
      而那些数据成员都是普通的数据成员,静态成员没有被复制,所以当系统调用默认复制构造函数的时候,静态成员并没有变化,所以book3创建的时候counter并没有捕捉到。

      解决问题的一个好办法,就是尽量避免系统调用默认的函数,意即设计类的时候提供完善的复制方面的函数,如复制构造函数,等号重载符,地址操作符等等。