C++ 在头文件或构造函数中初始化 const class 成员变量?

C++ Initialize const class member variable in header file or in constructor?

我只是想问一下,在 C++ 中,在头文件或构造函数中初始化 const class 成员变量的最佳实践是什么?

谢谢:)

在头文件中:

.h file:

class ExampleClass{

public:
ExampleClass();

private:
const std::string& string_member_variable_ = "Sample Text";
}

在构造函数中:

.h file:

class ExampleClass{

public:
ExampleClass();

private:
const std::string& string_member_variable_;
}

.cpp file:

ExampleClass::ExampleClass() : string_member_variable_("Sample Text") {}

如果使用 C++11,您可以就地初始化。您也可以在构造函数中初始化。在 class 中初始化 const 成员字段的两种方法:

class MyClass{
public:
    const std::string myconst = "Hello World";  // in-place initialization C++11
};

class MyClass{
public:
    const std::string myconst;
    MyClass() : myconst("Hello World"){}    // initialize const member in a constructor
};

当谈到非静态整数常量时,我​​会选择构造函数选项。在头文件中声明一个常量,并在源文件的构造函数中对其进行初始化。 另一件事是这部分:

const std::string& string_member_variable_ = "Sample Text";

是错误的,你的编译器会警告你:

reference member is initialized to a temporary that doesn't persist after the constructor exits

改用const std::string

它们并不完全相同,使用构造函数初始化的一个缺点是您需要维护初始化顺序 此外,如果您使用 .cpp 和 .h,您可能需要始终切换到 cpp 以查找初始化值。

这个问题已经回答了C++11 member initializer list vs in-class initializer?

"in the constructor" 的参数:

  • 旧代码库的代码风格一致性。
  • 需要在不同平台上使用不同的编译器构建代码。
  • 可能会减少开发时的编译时间。如果您更改常量的值,所有包含您的 header 的单元都将被重建。