14.3 构造函数的初始化表达式表

已经看到,在C++中保证正确的初始化是多么重要,这一点在组合和继承中也是一样。当创建一个对象时,编译器确保调用了所有子对象的构造函数。到目前为止,在已有的例子中,所有子对象都有默认的构造函数,编译器可以自动调用它们。但是,如果子对象没有默认构造函数或如果想改变构造函数的某个默认参数,情况怎么样呢?这会出现问题的,因为这个新类的构造函数没有权利访问这个子对象的私有数据成员,所以不能直接地对它们初始化。

解决的方法很简单:对于子对象调用构造函数,C++为此提供了专门的语法,即构造函数的初始化表达式表。构造函数的初始化表达式表的形式模仿继承活动。对于继承,我们把基类置于冒号和这个类体的左括号之间。而在构造函数的初始化表达式表中,可以将对子对象构造函数的调用语句放在构造函数参数表和冒号之后,在函数体的左括号之前。对于从Bar继承来的类MyType,如果Bar的构造函数只有一个int型参数,则可以表示为:

14.3 构造函数的初始化表达式表 - 图1

14.3.1 成员对象初始化

显然,对于组合,也可以对成员对象使用同样语法,只是所给出的不是类名,而是对象的名字。如果在初始化表达式表中有多个构造函数的调用,应当用逗号加以隔开:

14.3 构造函数的初始化表达式表 - 图2

这是类MyType2构造函数的开头,该类是从Bar继承来的,并且包含一个称为m的成员对象。请注意,虽然可以在这个构造函数的初始化表达式表中看到基类的类型,但只能看到成员对象的标识符。