在例2.13中,构造函数中有三个默认的参数,三个参数是简单的数据类型。当类的成员是对象,而且成员对象也有参数需要传递时,该如何处理呢?如在例2.12中,若增加桌面的长和宽,桌腿的高,那么该如何给它们传递参数呢?如果在Desk类的构造函数中,增加构造桌面和桌腿对象的初始化,能否实现给成员对象传递参数呢?
【例2.14】改造例2.12,如下程序例2.14所示。定义一个桌子对象,桌面有长度和宽度,桌腿有高度。
显然例2.14 所运行的结果不是我们所想要的结果,在桌子的构造函数内,增加语句“Desk Face df(le,w);Desk Leg d(h);”,企图把参数传递给数据成员df和d,而实际上却是在构造函数内创建了两个局部对象,不能把参数传递和初始化数据成员。那么能不能在类定义内直接初始化呢?如把Desk类定义成如下形式。
在例2.14修改后程序编译时,无论是哪种形式,系统都提示语法错误,显然这样不能解决问题。在C++中提供了冒号语法来解决这个问题,在构造函数的函数头后对类的数据成员的构造函数进行调用。使用冒号语法给数据成员初始化时,要注意以下两点:(1)冒号语法中的成员初始值列表只能存在于构造函数中,普通函数不使用;(2)成员列表必须放在构造函数的函数头部分,即在函数头后加冒号“:”,然后写成员初始值表,格式为:数据成员名(值参)[,数据成员名(值参)]。如改为如下形式,就可以实现。
在此例中le和w 是Desk构造函数的形式参数,df(le,w)表示调用le,w 为实际参数的Desk Face构造函数。当有多个成员需要参数传递初始化时用逗号分隔多个成员。系统在执行构造函数时,首先执行构造函数头处代码,发现有冒号,则初始化成员对象,然后再执行构造函数体内的代码,完成对象的初始化。在创建对象时,使用语句“Desk desk(3,2,1);”,无需再写数据成员的构造函数。(www.daowen.com)
对于类的数据成员是普通的一般变量时,使用冒号方式或放在函数体内初始化都一样。如果在构造函数内容仅对数据成员初始化,则使用冒号方式,代码会比较简洁。例如下面两种方式都可以实现。
使用冒号语法,可以为类的数据成员直接初始化,特别是当数据成员是类类型时,系统先创建成员对象,然后完成当前对象的初始化。
【例2.15】设计杯子类,杯子由杯盖和杯体组成,杯盖和杯体都是类类型,其中杯盖有颜色属性,创建一个杯盖为黑色的杯子对象。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。