2

至少有两种方法可以在 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().

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

4

3 回答 3

6

主要区别在于不使用初始化列表,而是创建成员,然后为它们分配值。使用初始化列表时,成员是使用给定值直接创建的。

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

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

这个问题也可以帮助您:在这种特定情况下,使用成员初始化程序列表和在构造函数中分配值之间有区别吗?

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

有人说,做一个正确的程序比做一个快速的程序正确容易。;)

于 2013-02-04T14:55:29.183 回答
5

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

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

于 2013-02-04T14:51:52.057 回答
0

Below are the scenarios when initializer list is used:

  • For initialization of non-static const data members.
  • For initialization of reference members.
  • For initialization of member objects which do not have default constructor.
  • For initialization of base class members.
  • When constructor’s parameter name is same as data member.
  • For Performance reasons.
于 2016-09-28T12:21:57.253 回答