繁体   English   中英

初始化列表与初始化方法

[英]Initializer list vs. initialization method

至少有两种方法可以在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中提到的可能的性能损失)。

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

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

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

这个问题也可以帮到你: 在这个特定的情况下,使用成员初始化列表和在构造函数中赋值是否有区别?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM