函数名和花括号之间成员变量赋值的名称和原因是什么?

时间:2010-09-02 10:01:01

标签: c++ language-features

请看这段代码:

Size::Size(int iSetWidth, int iSetHeight)
:iWidth(iSetWidth),
iHeight(iSetHeight)
{
}

据说,这意味着同样的事情:

Size::Size(int iSetWidth, int iSetHeight)
{
    iWidth=iSetWidth;
    iHeight=iSetHeight;
}

为什么要使用前者或后者?前者的名字是什么?

3 个答案:

答案 0 :(得分:17)

不,他们的意思并不完全一样。

执行构造函数时,在输入代码块(花括号之间的代码)之前,它构造所有对象数据成员。你在初始化器(冒号后和花括号之前的代码)中所做的是指定要用于这些成员的构造函数。如果没有为特定数据成员指定构造函数,则将使用默认构造函数。

因此,如果使用初始化列表(第一个示例),则将为每个成员使用正确的构造函数,而不需要其他代码。如果不这样做,首先使用默认构造函数,然后执行花括号内的代码。

总结:

  1. 在第一个示例中,使用适当的构造函数(可能是复制构造函数)初始化每个成员。
  2. 在第二个示例中,每个成员都是使用默认构造函数构造的,然后执行一些额外的代码来初始化它,可能是赋值运算符。
  3. 编辑:对不起,忘了在最后一行回答你的问题。

    冒号和花括号之间的代码名称是初始化列表。

    如果您知道哪个是变量或数据成员的正确构造函数,请务必使用它。这就是为什么大多数类具有不同的构造函数而不仅仅是默认构造函数的原因。所以最好使用初始化列表。

    初始化列表几乎从不比其他技术慢,并且可以更快。编写代码时众所周知的规则是“不要过早地优化”,但是有一个不太为人所知的对应物:不要过早地悲观。如果您有两种编写代码的选项,其中一种可能比另一种更好,但不涉及额外的工作或复杂性,请使用它。在您的示例中没有区别,因为您使用的是内置类型(int)。但如果您使用的是类,则会有所不同,所以请习惯初始化列表。

答案 1 :(得分:3)

前者称为初始化列表。 你可以获得很多文章。

此处给出了使用初始化列表的特殊原因 http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/

您可以参考Effective C ++来全面了解初始化列表。 希望很清楚。

答案 2 :(得分:0)

BTW,Bjarne Stroustrup在 C ++编程语言 中说,初始化列表可以获得一些效率,他建议我们使用初始化列表!