永远在对象是使用之前初始化它。
不要混淆了成员变量的赋值和初始化的区别:
对于对象的非内置类型(int,char等)成员,他们的初始化动作时发生在构造函数本体之前。在构造函数中,这些成员是被复制,而不是被初始化。初始化发生在这些成员的default构造函数被调用之时。但是对于内置类型成员不能保证也是如此的。
我们可以在构造函数前加入member initialization list(成员初值列表)替换复制动作:
class Number
{
private:
Explicit _e;
Explicit _e2;
public :
Number(int i)
:_e2(5),
_e(i)
{
printf("Number 构造函数./n");
}
virtual
~Number( )
{
printf("Number 析构函数./n");
}
};
如果不加成员初值列表,相当于成员向初始化,然后马上赋值,这样前面的初始化就相当于白费了。
对于内置类型成员,它赋值和初始化的成本相同,最好也通过初始化列表来实现,这样可以保持统一。
注意:必须在初值成员列表中初始化所有的成员。
如果成员过多,且类有多个构造函数,则初值成员列表可能会过程,造成代码重复。 可以适当的将内置成员单独拎出来放在一个统一的函数中实现。总之,真正的初始化比伪初始化通常更可取。
注:成员的构造函数早于类的构造函数,而析构函数晚于类的析构函数。
注:成员初始化顺序总是和成员声明的顺序相同,而和初值成员列表的顺序无关。
注意:
1、 为内置对象手动初始化,因为c++不保证初始化他们。
2、 构造函数最好使用成员初值列,而不要在构造函数中使用赋值操作。初值列中成员的顺序,应该和他们在class中声明的顺序一样。
3、 为避免“跨编译单元值初始化次序”问题,请以local static对象代替non-local static对象。