1、C++规定,对象的成员变量(自定义类型)的初始化动作发生在进入构造函数本体之前,在构造函数内不是初始化,而是赋值操作。初始化的发生时间更早,发生于这些成员的default 构造函数被自动调用之时(比进入对象的构造函数的时间要更早)。
应该用成员初始化列表代替赋值操作,其效率较高。基于赋值的版本首先调用成员变量的default构造函数为其设初值,然后立刻再对它们赋予新值。而成员初始化列表避免了这一问题,因为初始列中为各个成员变量而设的实参,被拿去作为各个成员变量之构造函数的实参。
2、有些情况下即使面对的成员变量属于内置类型,也一定得使用初始列。是的,如果成员变量是const或引用,它们就一定需要初值,而不能被赋值。为避免需要记住成员变量何时必须在成员初试列表中初始化,何时不需要,最简单的做法就是:总是使用成员初始列,这样做有时候绝对必要,且又往往比赋值更高效。
3、C++有着固执的成员初始化次序。次序总是相同的:基类更早于其派生类被初始化,而class的成员变量总是以声明次序被初始化。
4、不同编译单元内(单一源码加上头文件的目标文件)定义之non-local static 对象的初始化次序?
问题:如果某编译单元内的某个non-local static 对象的初始化动作使用了另一编译单元内的某个non-local static对象,它所用到的这个对象可能尚未被初始化,因为C++对“定义于不同编译单元内的non-local static对象”的初始化次序并无明确定义。
幸运的是小小的设计可以消除该问题:将每个non-local static对象搬到自己的专属函数内(该对象在此函数内被声明为static)。这些函数返回一个引用指向所含的对象。然后用户调用这些函数,而不直接指涉这些对象。以local static(函数内的static对象)对象替换non-local static。