C++:在构造函数中初始化变量的位置
C++: Where to initialize variables in constructor
可能重复:
C++初始化列表
选项1与选项2初始化变量的优缺点是什么?
class MyClass
{
public:
MyClass( float f, char a );
private:
float mFloat;
char mCharacter;
bool mBoolean;
int mInteger;
};
MyClass::MyClass( float f, char a ) : mFloat( f ), mBoolean( true ) // option 1.
{
// option 2
mCharacter = a;
mInteger = 0;
}
编辑:为什么选项2如此常见?
简而言之,在可能的情况下,始终首选初始化列表。2个原因:
-
如果您在类的初始化列表中没有提到变量,那么构造函数将在输入您编写的构造函数的主体之前对其进行默认初始化。这意味着选项2将导致每个变量被写入两次,一次用于默认初始化,另一次用于构造函数主体中的赋值。
-
此外,正如mwigdahl和avada在其他答案中所提到的,const成员和reference成员只能在初始化列表中进行初始化。
还要注意的是,变量总是按照它们在类声明中声明的顺序初始化,而不是按照它们在初始化列表中列出的顺序初始化(如果启用了适当的警告,编译器会在列表写错顺序时发出警告(。类似地,在类的析构函数中的代码执行之后,析构函数将以相反的顺序调用成员析构函数,从类声明的最后一个到第一个。
尽管它不适用于这个特定的示例,但选项1允许您初始化引用类型(或const
类型,如下所述(的成员变量。选项2没有。总的来说,备选方案1是更有力的方法。
请参阅我的构造函数应该使用"初始化列表"还是"赋值"?
简单地说:在你的具体情况下,它不会改变任何事情。但是:
- 对于具有构造函数的类/结构成员,使用选项1可能更有效
- 只有选项1允许您初始化引用成员
- 只有选项1允许初始化const成员
- 只有选项1允许您使用基类的构造函数初始化基类
- 只有选项2允许初始化没有构造函数的数组或结构
我对选项2更常见的原因的猜测是,选项1并不为人所知,它的优势也不为人所熟知。对于新的C++程序员来说,选项2的语法感觉更自然。
const
成员。选项2无法做到这一点(因为它们被分配给,而不是初始化(。
为什么常量成员必须在构造函数初始值设定项中初始化,而不是在其主体中初始化?
选项1允许您使用专门指定的位置来显式初始化成员变量。
还有许多其他原因。如果可能的话,您应该始终初始化初始化列表中的所有成员变量。
http://www.parashift.com/c++-faq-lite/ects.html#faq-10.6
- 非常量变量只读位置的赋值
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 在 elf 文件中查找全局变量的位置
- C++强制变量到一个固定的内存位置
- 当使用Lua作为嵌入式语言(比如c++)时,有什么简单/方便的方法可以找到变量在Lua中的定义位置吗
- 函数,返回变量c++占用的内存位置的大小
- 在 Visual Studio 2010(及更高版本)中定义包含或链接路径变量的位置
- 为什么动态分配的两个变量的内存位置不是连续的?
- ClangTool 如何获取变量声明中模板参数的位置?
- 如何跟踪通过外部代码修改类变量的所有位置
- 适用于会员变量的新位置
- C++每个变量的存储位置是否正确?
- 可视C 编译器将相同的存储位置提供给两个变量
- 双变量的精度仅为十点后的2个位置
- *的位置有什么区别:*变量与变量*
- 引用变量何时合适,为什么?你能解释一下实际的语法和位置吗?
- 局部类变量位置
- 运行时检查失败 #2 - 变量"位置"周围的堆栈已损坏
- 将cout引用到一个变量位置(文件或cmd)
- 单例的静态变量位置