详解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()
{
}