静态成员有一个特点:无 论创建了几个对象,程序都只创建一个静态成员变量副本.也就是说,类的所有共同对象共享一个静态成员。 静态成员的一个应用是对象计数器。
对于静态成员,可以在类声明之外使用单独语句来初始化:
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并没有捕捉到。
解决问题的一个好办法,就是尽量避免系统调用默认的函数,意即设计类的时候提供完善的复制方面的函数,如复制构造函数,等号重载符,地址操作符等等。