这个问题已经在这里有了答案:




9年前关闭。






在选项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成员和引用成员只能在初始化列表中初始化来

  • 还要注意,变量总是按照它们在类声明中声明的顺序进行初始化,而不是按照它们在初始化列表中列出的顺序进行初始化(启用适当的警告后,如果列表写错了,编译器会警告您)。同样,在执行了类的析构函数中的代码之后,析构函数将以相反的顺序调用成员析构函数,从类声明中的倒数第一开始。

    07-24 09:45
    查看更多