【问题标题】:What is the correct way to initialize static data members in C++ (98, 11 and 14)在 C++(98、11 和 14)中初始化静态数据成员的正确方法是什么
【发布时间】:2014-12-26 05:56:15
【问题描述】:

在 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】:

规则一直如下:

  • 可以在类中使用常量表达式初始化 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;
};

【讨论】:

  • 您应该提到,即使您可以使用类内初始化程序,仍可能需要类外定义。
  • @JonathanWakely 我认为这很明显,因为类中的东西始终只是一个声明(如果实体是 odr-used,则需要定义)。
  • 不幸的是,对于许多认为类内初始化程序也提供定义的人来说,这并不明显:-\ 无论如何,如果允许,我现在再给你一个 +1 作为最后的说明!
  • 要符合 MISRA,初始化程序应为 50L 否则您将整数分配给 long。
  • @Anonymous long 保证能够表示int 可以表示的任何值。
猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多