从概念上讲,可以认为构造函数分两个阶段执行:(1)初始化阶段;(2)普通的计算阶段,计算阶段
由构造函数函数体中的所有语句组成。
不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化,初始
化发生在计算阶段开始之前。
在构造函数初始化列表中没有显式提及的每个成员,使用与初始化“变量”相同的规则来进行初始化。
运行该类型的默认构造函数,来初始化类类型的数据成员。内置或复合类型的成员的初始值依赖于对象的
作用域:在局部作用域中这些成员不被初始化,而在全局作用域中他们初始化为0。
有些成员必须在构造函数初始化列表中进行初始化。对于这样的成员,在构造函数函数体中对他们赋值
不起作用。没有默认构造函数的类类型成员,以及const或引用类型的成员,不管是哪种类型,都必须在
构造函数初始化列表中进行初始化。
类NoDefault没有默认构造函数意味着:
(1)具有NoDefault成员的每个类的每个构造函数,必须传递一个初始的参数值给NoDefault非默认构造函数来显式地初始化NoDefault成员。
(2)编译器将不会为具有NoDefault类型成员的类合成默认构造函数。如果这样的类希望提供默认构造函数,就必须显式地定义,并且默认构造函数必须显式地初始化其NoDefault成员。
(3)NoDefault类型不能用作动态分配数组的元素类型。
(4)NoDefault 类型的静态分配数组必须为每一个元素提供一个显式的初始化式。
(5)如果有一个保存NoDefault对象的容器,如vector,就不能使用接受容器大小而没有同时提供一个元素初始化式的构造函数。