类可以包含静态成员数据和成员函数。 当数据成员声明为 static时,只有一个数据复制保留了该类的所有对象。有关更多信息,请参见 静态成员函数。
静态数据成员不属于给定类的类型的对象的一部分;它们是单独的对象。 因此,静态数据成员的声明不被视为定义。 数据成员在类范围中声明,但是,定义在文件范围内执行。 这些静态成员具有外部链接。 下面的示例阐释了这一点:
// static_data_members.cpp
class BufferedOutput
{
public:
// Return number of bytes written by any object of this class.
short BytesWritten()
{
return bytecount;
}
// Reset the counter.
static void ResetCount()
{
bytecount = 0;
}
// Static member declaration.
static long bytecount;
};
// Define bytecount in file scope.
long BufferedOutput::bytecount;
int main()
{
}
在前面的代码中,该成员 bytecount 在类 BufferedOutput 中声明,但必须在类声明之外定义。
静态数据成员可以引用而不引用类类型对象。 获取通过使用 BufferedOutput 对象编写的字节数如下所示:
long nBytes = BufferedOutput::bytecount;
对于要存在的该静态成员,并不须要该类类型的任意对象均存在。 使用成员-选择 (. 和 –>) 运算符可以访问静态成员。 例如:
BufferedOutput Console;
long nBytes = Console.bytecount;
在前例中,该对象 (Console) 的引用没有计算;返回值是静态对象 bytecount 的值。
静态数据成员受到类成员访问规则的限制,因此,对静态数据成员的私有访问只允许类成员函数和友元。 这些规则在Member-Access Control中被描述。 为静态数据成员的异常必须在文件范围中定义,而不管其访问限制。 如果将显式初始化数据成员,必须提供定义初始值设定项。
静态成员的类型未由其类名称限定。 因此,BufferedOutput::bytecount 的类型是 long。