初始化列表与初始化方法

时间:2013-02-04 14:49:08

标签: c++

至少有两种方法可以用C ++初始化类。

(1)初始化列表

struct C
{
  int i;
  C() : i(0) {}
};

(2)初始化方法

struct D
{
  int i;
  C() { init(); }
  void init() {
    i = 0;
  }
};

我需要不时地重新启动课程对象。使用第二种解决方案,我只需拨打obj.init()即可。使用第一个解决方案,我要么必须添加一个init()函数,它基本上复制了初始化列表效果或使用obj = C()

对于哪种变体在这里更好,是否存在或多或少的共识?使用初始化方法是否有缺点(除了mentioned in the C++ FAQ可能会导致性能损失。)

3 个答案:

答案 0 :(得分:6)

主要区别在于,如果不使用初始化列表,则会创建成员,然后为其分配值。使用初始化列表时,可以使用给定值直接创建成员。

使用初始化时的一种情况很重要,就是当你的类将一些引用作为成员保存时,有必要在构造它们时正确初始化这些成员:

class A
{
public:
    A(B& bRef) : bRef_(bRef) { }
private:
    B& bRef_;   
}

这个问题也可以帮到你:In this specific case, is there a difference between using a member initializer list and assigning values in a constructor?

您的init()方法非常好。正如您自己提到的那样,您希望初始化这些成员的次数多于第一次构造此类实例的时间,因此为了可重用性和简单性,将其保留在方法中是正确的。 除非确实需要,否则不要尝试提高代码的性能。

有些人说制作正确的程序比制作快速程序更快更容易。;)

答案 1 :(得分:5)

创建数组(使用向量,或使用new动态分配)时,您必须在使用构造函数时在其每个成员上显式调用init,它将自动为所有元素调用

我更喜欢将基本初始化放入构造函数中,将更复杂的逻辑放入init方法中。在我看来,构造函数不应该执行任何复杂的操作。

答案 2 :(得分:0)

以下是使用初始化列表时的方案:

  • 用于初始化非静态const数据成员。
  • 用于初始化参考成员。
  • 用于初始化没有默认构造函数的成员对象。
  • 用于初始化基类成员。
  • 当构造函数的参数名称与数据成员相同时。
  • 出于性能原因。