Nav*_*Nav 5 c++ initialization-list
Parashift很好地解释了初始化列表,但没有解释为什么在ctor体中赋值之前创建了额外的变量副本,但是在通过初始化列表分配时不会创建额外的副本.
我甚至遇到过使用++ i而不是i ++的建议,因为前者避免在赋值之前创建临时i.对于在监管机构中分配的POD,它是否相同?在赋值发生之前创建临时变量?
换句话说,为什么编译器需要创建变量的额外副本?为什么不能直接分配变量?
为什么?
考虑以下:
struct C {
C() { /* construct the object */ }
};
struct X {
C member;
X() { member = C(); }
};
Run Code Online (Sandbox Code Playgroud)
构造函数X()与您所说的相同:
X() : member() { member = C(); }
Run Code Online (Sandbox Code Playgroud)
首先,C调用构造函数来构造member数据成员。然后执行 的主体X,创建第二个临时C对象并将其分配给member,然后销毁该临时对象。
请注意,这仅适用于自动初始化的类型。如果member是类型int或 POD 类类型(作为示例),则在X输入构造函数主体时它将被取消初始化。
对于此类类型,从性能角度来看,是在初始化列表中初始化数据成员还是在构造函数主体中分配给数据成员并不重要;差异完全是风格上的。在可能的情况下,为了保持一致性,仍应首选初始化列表。