初始化器列表与初始化方法 在C++中至少有两种初始化类的方法。

初始化器列表与初始化方法 在C++中至少有两种初始化类的方法。,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() 对于哪种变体更好,是否有或多或少的共

(1) 初始值设定项列表

struct C
{
  int i;
  C() : i(0) {}
};
(2) 初始化方法

struct D
{
  int i;
  C() { init(); }
  void init() {
    i = 0;
  }
};
我需要不时地重新初始化类的对象。对于第二种解决方案,我只需调用
obj.init()
。对于第一个解决方案,我要么添加一个基本上复制初始值设定项列表效果的
init()
函数,要么使用
obj=C()

对于哪种变体更好,是否有或多或少的共识?使用初始值设定方法是否有缺点(除了可能的性能损失)。当创建数组(使用vector,或使用
new
动态分配)时,在使用构造函数时,必须显式调用其每个成员上的
init
,它将自动为所有元素调用


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

主要区别在于,在不使用初始化列表的情况下,创建成员,然后为其分配值。当您使用初始化列表时,将使用给定的值直接创建成员

当使用初始化非常重要时,其中一种情况是,您的类将某些引用作为成员保存,并且在构造这些成员时需要正确初始化这些成员:

class A
{
public:
    A(B& bRef) : bRef_(bRef) { }
private:
    B& bRef_;   
}
这个问题也可以帮助你:

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


有人说,快速编写正确的程序比快速编写正确的程序容易。;)

以下是使用初始值设定项列表时的场景:

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

对于POD成员,可能没有性能损失。您不能总是默认初始化类型,在这种情况下,变量(2)将不是一个选项。只要您没有遇到编译器不允许这样做的情况,并且您记住了性能问题,那么
init
就可以了。