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 的单元都将被重建。
我只是想问一下,在 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 的单元都将被重建。