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

bod*_*ydo 28 c++ static-members c++11 c++98 c++14

static在C++中初始化数据成员的正确方法是什么?我也对它从C++ 98,C++ 11到C++ 14的变化感兴趣.

这是一个例子:

// bufferedOutput.h
class BufferedOutput
{
 // Static member declaration.
 static long bytecount;
};

// bufferedOutput.cpp
long BufferedOutput::bytecount = 50;
Run Code Online (Sandbox Code Playgroud)

还有其他方法来初始化static数据成员吗?

Col*_*mbo 35

规则一直如下:

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

  • constexprSDM必须类被初始化以恒定表达.

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

  • 其他类型的SDM可以在其定义中具有初始化器(如果声明了SDM,则在类中inline).

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

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

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

class BufferedOutput
{
  static inline long bytecount = 50;
};
Run Code Online (Sandbox Code Playgroud)

  • 您应该提到即使您可以使用类内初始化程序,仍可能需要一个类外定义. (2认同)