Learning ROS for Robotics Programming - Second Edition
13.3构造函数的初始化表达式表我们已经看到,在C++中保证合适的初始化表达式多么重要,在组合和继承中,也是一样。当创建一个对象时,必须保证编译器调用所有子对象的构造函数。到目前为止,例子中的所有子对象都有缺省的构造函数,编译器可以自动调用它们。但是,如果子对象没有缺省构造函数或如果我们想改变某个构造函数的缺省参数,情况会怎么样呢?这是一个问题,因为这个新类的构造函数不能保证访问它的子对象的private数据成员,所以不能直接地对它们初始化。解决办法很简单:对于子对象调用构造函数,C++为此提供了专门的语法,即构造函数的初始化表达式表。
构造函数的初始化表达式表的形式模仿继承活动。对于继承,我们在冒号之后和这个类体的左括号之前放置基类。而在构造函数的初始化表达式表中,我们可以将对子对象构造函数的调用语句放在构造函数参数表和冒号之后,在函数体的开括号之前。对于从bar继承来的类foo,如果bar有一个取单个int参数的构造函数,则表示为foo::foo(int i) : bar(i) { //...
13.3.1 成员对象初始化
当使用组合时,对于成员对象初始化使用相同的语法是不可行的。对于组合,给出对象的名字而不是类名。如果在初始化表达式表中有多于一个构造函数调用,应当用逗号隔开:foo2:foo2(int i) : bar(i), memb(i+1) { // ...这是类foo2构造函数的开头,它是从bar继承来的,包含称为memb的成员对象。注意,当我们在这个构造函数的初始化表达式表中能看到基类的类型时,只能看到成员对象的标识符。
13.3.2 在初始化表达式表中的内置类型
构造函数的初始化表达式表允许我们显式地调用成员对象的构造函数。事实上,这里没有其它方法调用那些构造函数。主要思想是,在进入新类的构造函数体之前调用所有的构造函数。这样,对子对象的成员函数所做的任何调用都已经转到了这个被初始化的对象中。没有对所有的成员对象和基类对象的构造函数调用,就没有办法进入这个构造函数的左括号,即便是编译器也必须对缺省构造函数做隐藏调用。这是C++进一步的强制,以保证没有调用它的构造函数就没有对象(或对象的部分)能进入第一道门。所有的成员对象在构造函数的左括号之前被初始化的思想是编程时一个方便的辅助方法。一旦遇到左括号,我们能假设所有的子对象已被适当地初始化了,并集中精力在希望该构造函数完成的特殊任务上。然而,这里还有一个问题:内置类型的嵌入对象如何?它没有构造函数吗?为了让语法一致,允许对待内置类型就像对待有单个构造函数的对象一样,它取单个参数:这个参数与我们正在初始化的变量类型相同。
对于更多关于构造函数初始化表达式表的信息,可以参考这篇文章。如果你对JavaScript中的构造函数继承感兴趣,这篇文章也提供了详细的解释。
这样,我们就可以写:258 C++编程思想下载。