2010-09-02 59 views

回答

17

不,他们不完全一样。

当执行构造函数时,在输入代码块(花括号之间的代码)之前,它会构造所有对象数据成员。初始化程序(冒号后面的代码和花括号之前的代码)的作用是指定哪些构造函数用于这些成员。如果您没有为特定数据成员指定构造函数,则将使用默认构造函数。因此,如果您使用初始化列表(第一个示例),则正确的构造函数将用于每个成员,并且不需要额外的代码。如果你不这样做,首先使用默认构造函数,然后执行花括号内的代码。

总结:

  1. 在你的第一个例子中,每个成员使用适当的构造函数,可能是拷贝构造函数初始化。
  2. 在第二个示例中,每个成员都使用默认的构造函数构造,然后执行一些额外的代码来初始化它,可能是赋值运算符。

编辑:对不起,忘了在最后一行回答你的问题。

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

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

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

+1

除了Gorpik写的(我的'+ 1',BTW):在像Java和C#这样的语言中,所有变量都是_references_,这并不重要,因为成员无论如何,初始化只是一个地址分配。在C++中,类数据成员通常是初始化的真正对象,而不是初始化为引用堆上对象的引用(指针)。例如,对于'std :: string'的合理实现,默认初始化后跟赋值可能比立即使用正确数据初始化要慢得多。 – sbi 2010-09-02 11:09:16

+0

@sbi:并非所有变量都是C#中的引用。该语言也具有价值类型:) – jalf 2010-09-02 12:04:30

+0

@jalf:我故意简化了一些东西。 – sbi 2010-09-02 19:18:12

3

前者称为初始化列表。 你可以获得大量的文章。

使用初始化器列表的具体原因都在这里 http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/

给出你可以参考C++有效得到充分的洞察初始化程序列表。 希望很明显。

+2

像[this](http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6)。 – 2010-09-02 10:05:11

+0

^^非常多这^^ – 2010-09-02 10:07:38

0

BTW,Bjarne的Stroustrup的在说,C++编程语言,一些效率与初始化列表来获得他推荐我们使用初始化列表!

+1

如果你可以提供一个参考,你可能会得到一些upvotes – 2012-08-20 12:55:44

相关问题