详解C++编程中的静态成员与可变数据成员
静态成员
类可以包含静态成员数据和成员函数。当数据成员被声明为“静态”时,只会为类的所有对象保留一个数据副本。
静态数据成员不是给定的类类型的对象的一部分。因此,静态数据成员的声明不被视为一个定义。在类范围中声明数据成员,但在文件范围内执行定义。这些静态类成员具有外部链接。下面的示例阐释了这一点:
//static_data_members.cpp classBufferedOutput { public: //Returnnumberofbyteswrittenbyanyobjectofthisclass. shortBytesWritten() { returnbytecount; } //Resetthecounter. staticvoidResetCount() { bytecount=0; } //Staticmemberdeclaration. staticlongbytecount; }; //Definebytecountinfilescope. longBufferedOutput::bytecount; intmain() { }
在前面的代码中,该成员bytecount在类BufferedOutput中声明,但它必须在类声明的外部定义。
在不引用类类型的对象的情况下,可以引用静态数据成员。可以获取使用BufferedOutput对象编写的字节数,如下所示:
longnBytes=BufferedOutput::bytecount;
对于存在的静态成员,类类型的所有对象的存在则没有必要。还可以使用成员选择(.和–>)运算符访问静态成员。例如:
BufferedOutputConsole; longnBytes=Console.bytecount;
在前面的示例中,不会评估对对象(Console)的引用;返回的值是静态对象bytecount的值。
静态数据成员遵循类成员访问规则,因此只允许类成员函数和友元拥有对静态数据成员的私有访问权限。
可变数据成员
此关键字只能应用于类的非静态和非常量数据成员。如果某个数据成员被声明为mutable,则从const成员函数为此数据成员赋值是合法的。
语法
mutablemember-variable-declaration;
备注
例如,以下代码在编译时不会出错,因为m_accessCount已声明为mutable,因此可以由GetFlag修改,即使GetFlag是常量成员函数。
//mutable.cpp classX { public: boolGetFlag()const { m_accessCount++; returnm_flag; } private: boolm_flag; mutableintm_accessCount; }; intmain() { }