静态数据成员 (C++)

类可以包含静态成员数据和成员函数。 当数据成员声明为 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。

请参见

参考

类、结构和联合