C ++:在构造函数中初始化变量的位置

时间:2011-07-25 21:11:26

标签: c++ constructor initialization

  

可能重复:
  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如此普遍?

6 个答案:

答案 0 :(得分:104)

简而言之,在可能的情况下,始终首选初始化列表。有两个原因:

  • 如果您没有在类的初始化列表中提及变量,构造函数将默认初始化它,然后再输入您编写的构造函数的主体。这意味着选项2将导致每个变量被写入两次,一次用于默认初始化,一次用于构造函数体中的赋值。

  • 此外,正如mwigdahl和avada在其他答案中所提到的,const成员和参考成员只能 在初始化列表中初始化。

另请注意,变量总是按照它们在类声明中声明的顺序进行初始化,而不是按照它们在初始化列表中列出的顺序进行初始化(如果启用了正确的警告,编译器会在列表无序写入时发出警告)。类似地,在类的析构函数中的代码执行完毕后,析构函数将以相反的顺序调用成员析构函数,在类声明中为第一个。

答案 1 :(得分:21)

虽然它不适用于此特定示例,但选项1允许您初始化引用类型(或const类型的成员变量,如下所述)。选项2没有。一般来说,选项1是更强大的方法。

答案 2 :(得分:10)

请参阅Should my constructors use "initialization lists" or "assignment"?

简单地说:在你的具体情况下,它不会改变任何东西。但是:

  • 对于具有构造函数的类/ struct成员,使用选项1可能更有效。
  • 只有选项1允许您初始化参考成员。
  • 只有选项1允许您初始化const成员
  • 只有选项1允许您使用构造函数
  • 初始化基类
  • 只有选项2允许您初始化没有构造函数的数组或结构。

我猜测为什么选项2更常见的是选项1不是众所周知的,也不是它的优点。对于新的C ++程序员来说,选项2的语法更自然。

答案 3 :(得分:3)

选项1允许您使用完全指定的位置来显式初始化成员变量。

答案 4 :(得分:2)

还有很多其他原因。如果可能,您应该始终初始化初始化列表中的所有成员变量。

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6

答案 5 :(得分:1)

选项1允许您初始化const个成员。使用选项2无法完成此操作(因为它们已分配,未初始化)。

Why must const members be intialized in the constructor initializer rather than in its body?