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

C++: Where to initialize variables in constructor

本文关键字:变量 位置 初始化 构造函数 C++      更新时间:2023-10-16

可能重复:
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的语法感觉更自然。

选项1允许初始化const成员。选项2无法做到这一点(因为它们被分配给,而不是初始化(。

为什么常量成员必须在构造函数初始值设定项中初始化,而不是在其主体中初始化?

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

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

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