类的组合调用常见问题
在实际应用中,如果要实现多个类的嵌套调用时,这时候可以采用类的组合。
把一个类的对象作为另一个类的成员变量,即主调类的一个成员变量为被调类的对象,当成员变量在构造函数中进行初始化时。其调用顺序需要遵循一定的规则。下面是程序的运行顺序:
①形实结合:此时会调用被调类的复制构造函数为形参赋值(如果没有显示定义的话编译器会隐式生成一个赋值构造函数)但是,当形参为引用类型时,不会调用赋值构造函数。调用顺序与形参在形参表里(括号里)出现的顺序相反。
②为类的成员变量赋值:赋值的顺序严格按照成员变量在类中的声明顺序。为成员变量赋值有两种形式,分别为列表初始化和函数体内赋值。对于列表初始化,类类型的成员变量会调用其所属类的复制构造函数;对于函数体内赋值,则调用其所属类的默认构造函数(当我们自定义构造函数时,系统就不会自动生成默认构造函数了,需要显示定义一个默认构造函数,所以即使定义了构造函数也一般都会为类再写一个默认构造函数,方便其他类调用)。
③构造函数体结束前,会对形参占用的空间进行释放,如果形参是一个类类型,此时将会调用该类的析构函数,如果是类类型的引用,将不会调用析构函数,系统隐式释放形参占用的空间。
从上面我们可以发现,如果我们要将一个类A的对象作为实参赋值给类B的成员变量(A类型)时,默认会调用两次A的复制构造函数,此时可以通过下面两种方法来避免,其分别对于构造函数运行的① ②阶段
1.在B的构造函数形参表中为形参类型定义为引用类型;
2.在B的成员变量声明中定义为引用类型。