在C++(98、11和14)中初始化静态数据成员的正确方法是什么



在C++中初始化static数据成员的正确方法是什么?我还感兴趣的是它是如何从C++98、C++11到C++14变化的。

这里有一个例子:

// bufferedOutput.h
class BufferedOutput
{
 // Static member declaration.
 static long bytecount;
};
// bufferedOutput.cpp
long BufferedOutput::bytecount = 50;

是否有其他方法可以初始化static数据成员?

规则一直如下:

  • 积分或枚举类型的const静态数据成员(SDM)可以在类中用常量表达式初始化。

  • constexpr SDM必须在类中使用常量表达式进行初始化。

    当默认构造函数初始化每个成员时,C++17不再需要初始化器。此外,constexpr SDM是隐式内联变量,这使得它们的声明成为一个定义(现在不推荐使用外部定义)。

  • 其他类型的SDM可以在其定义中有一个初始值设定项(如果该SDM被声明为inline,则在类中)

对于在两种语言中都有效的代码,在C++03和C++11+之间没有任何实质性的变化。

请注意,对于非内联的SDO,类内声明不是定义—无论是否提供了初始化器—如果使用odr,则必须定义它们。

从C++17开始,我们可以使您的SDM内联,这使其类内声明成为一个定义:

class BufferedOutput
{
  static inline long bytecount = 50;
};

最新更新