可能重复:
C++ initialization lists
在选项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如此普遍?
答案 0 :(得分:104)
简而言之,在可能的情况下,始终首选初始化列表。有两个原因:
如果您没有在类的初始化列表中提及变量,构造函数将默认初始化它,然后再输入您编写的构造函数的主体。这意味着选项2将导致每个变量被写入两次,一次用于默认初始化,一次用于构造函数体中的赋值。
此外,正如mwigdahl和avada在其他答案中所提到的,const成员和参考成员只能 在初始化列表中初始化。
另请注意,变量总是按照它们在类声明中声明的顺序进行初始化,而不是按照它们在初始化列表中列出的顺序进行初始化(如果启用了正确的警告,编译器会在列表无序写入时发出警告)。类似地,在类的析构函数中的代码执行完毕后,析构函数将以相反的顺序调用成员析构函数,在类声明中为第一个。
答案 1 :(得分:21)
虽然它不适用于此特定示例,但选项1允许您初始化引用类型(或const
类型的成员变量,如下所述)。选项2没有。一般来说,选项1是更强大的方法。
答案 2 :(得分:10)
请参阅Should my constructors use "initialization lists" or "assignment"?
简单地说:在你的具体情况下,它不会改变任何东西。但是:
我猜测为什么选项2更常见的是选项1不是众所周知的,也不是它的优点。对于新的C ++程序员来说,选项2的语法更自然。
答案 3 :(得分:3)
选项1允许您使用完全指定的位置来显式初始化成员变量。
答案 4 :(得分:2)
还有很多其他原因。如果可能,您应该始终初始化初始化列表中的所有成员变量。
答案 5 :(得分:1)
选项1允许您初始化const
个成员。使用选项2无法完成此操作(因为它们已分配,未初始化)。
Why must const members be intialized in the constructor initializer rather than in its body?