在C++(98、11和14)中初始化静态数据成员的正确方法是什么
What is the correct way to initialize static data members in C++ (98, 11 and 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;
};
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 静态数据成员模板专用化的实例化点在哪里
- 调用在 HXX 文件中声明的静态数据成员
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 何时需要定义类的静态数据成员 (un/-)
- 为什么静态数据成员不能在c++11中的类中初始化
- 静态数据成员的模板专用化
- 拒绝包含某些公共静态数据成员的类型
- GCC:在调试构建中优化的静态数据成员
- 类模板静态数据成员定义/声明/初始化
- C++ 中的静态数据成员
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 使用 lambda 函数初始化静态数据成员
- 引用静态数据成员
- 学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)
- Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(使用 link.exe 和 lld-
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- 不带初始值设定项的 constexpr 静态数据成员