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

问题描述 投票:27回答:1

在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数据成员?

c++ c++11 static-members c++14 c++98
1个回答
35
投票

规则一直如下:

  • 可以使用常量表达式在类中初始化整数或枚举类型的const静态数据成员(SDM)。
  • 必须在类中使用常量表达式初始化constexpr SDM。 当默认构造函数初始化每个成员时,C ++ 17不再需要初始化程序。此外,constexpr SDM是隐式内联变量,这使得它们的声明成为一个定义(外部定义现已弃用)。
  • 其他类型的SDM可以在其定义中具有初始化器(如果SDM被声明为inline,则在类中)。

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

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

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

class BufferedOutput
{
  static inline long bytecount = 50;
};
© www.soinside.com 2019 - 2024. All rights reserved.