有关静态成员

 

     静态成员有一个特点: 论创建了几个对象,程序都只创建一个静态成员变量副本.也就是说,类的所有共同对象共享一个静态成员。 静态成员的一个应用是对象计数器。
     对于静态成员,可以在类声明之外使用单独语句来初始化:
               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并没有捕捉到。

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值