【问题标题】:C++: Where to initialize variables in constructor [duplicate]C ++:在构造函数中初始化变量的位置[重复]
【发布时间】:2011-07-25 21:11:26
【问题描述】:

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

【问题讨论】:

  • 不再与添加的编辑重复。由于选项 1 显然更好,我很好奇为什么选项 2 如此普遍。
  • 它可能是重复的,但似乎其他问题的答案是详尽的。

标签: c++ constructor initialization


【解决方案1】:

简而言之,尽可能选择初始化列表。 2 个原因:

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

  • 另外,正如 mwigdahl 和 avada 在其他答案中提到的,const 成员和引用成员只能在初始化列表中进行初始化。

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

【讨论】:

  • 感谢您提供的信息丰富的回答。关于选项 2,您的观点是标准还是某些特定的编译器?我认为编译器优化初始权限不会太难。我更喜欢选项 2,因为它更干净。
  • 编译器不应该能够优化掉不必要的自动初始化吗?我的意思是,C# 和 Java 可以做到,C++ 也应该做到,对吧?
  • 这叫做“初始化列表”,而不是“初始化列表”。
  • @0fnt,是的,C++ 优化了额外的初始化,这不是问题。不,仅仅因为一些成员必须这样做,并不意味着所有人都应该这样做。初始化列表,IMO,丑陋且难以阅读。
  • @Joey 即使对于原始类型是正确的,但对于编译器不知道默认构造函数做什么的用户类型(例如,在另一个编译单元中定义 - 甚至可能是共享库),这不可能是正确的)。
【解决方案2】:

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

【讨论】:

  • 对,但他没有引用类型。所以选项2很好。
  • 在他的具体示例中(这似乎是人为的,而不是取自真实世界的代码),是的!在更一般的情况下,选项 1 通常是优越的,这就是我所得到的。我将进行编辑以使其更清晰。
【解决方案3】:

Should my constructors use "initialization lists" or "assignment"?

简而言之:在您的具体情况下,它不会改变任何东西。但是:

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

我对选项 2 更常见的原因的猜测是选项 1 并不为人所知,其优势也不是。对于新的 C++ 程序员来说,选项 2 的语法感觉更自然。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 感谢您的链接!
      【解决方案6】:

      选项 1 允许您初始化 const 成员。选项 2 无法做到这一点(因为它们已分配给,未初始化)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-19
        • 2020-09-27
        • 2015-02-19
        • 2015-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多