C ++:在构造函数中初始化variables的位置
可能重复:
C ++初始化列表
选项1和选项2初始化variables有什么优点/缺点?
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个原因:
-
如果你没有在类的初始化列表中提到一个variables,构造函数将在进入你写的构造函数的主体之前默认初始化它。 这意味着选项2将导致每个variables被写入两次,一次用于默认初始化,一次用于构造函数体中的赋值。
-
而且,正如mwigdahl和avada在其他答案中所提到的,const成员和引用成员只能在初始化列表中初始化。
还要注意,variables总是按照它们在类声明中声明的顺序进行初始化,而不是按照它们在初始化列表中列出的顺序进行初始化(启用适当的警告时,如果列表乱序写入,编译器会发出警告)。 类似的,析构函数会按照相反的顺序调用成员析构函数,在类的析构函数中的代码执行之后,最后在类声明中首先调用成员析构函数。
虽然它不适用于这个特定的例子,但是选项1允许你初始化引用types(或者const
types,如下所示)的成员variables。 选项2没有。 一般来说,选项1是更强大的方法。
看看我的构造函数应该使用“初始化列表”还是“赋值”?
简而言之:在你的具体情况下,它不会改变任何东西。 但:
- 对于具有构造函数的类/结构成员,使用选项1可能更有效。
- 只有选项1允许您初始化参考成员。
- 只有选项1允许你初始化const成员
- 只有选项1允许您使用其构造函数初始化基类
- 只有选项2允许您初始化没有构造函数的数组或结构体。
我为什么选项2更常见的猜测是选项1不是众所周知的,它的优点也不是很清楚。 新的C ++程序员对选项2的语法感觉更自然。
选项1允许您使用指定的位置来显式初始化成员variables。
还有很多其他的原因。 如果可能的话,您应始终初始化初始化列表中的所有成员variables。
选项1允许你初始化const
成员。 这不能用选项2来完成(因为它们被分配给,没有被初始化)。
为什么const构件必须在构造函数初始化程序中初始化而不是在它的内部?