第十四节重载复制转换2010_11.ppt

隐含使用转换构造函数 在表达式中,当需要转换的对象可以转换成某个数字类型,或者表达式调用了作用于某个类的重载运算符时,就会发生隐式转换。 编译器也可在需要将另一类型的数据项换算成(赋给)类对象时调用相应的转换构造函数。 例1: account Bucks ; Bucks =29.95 ; Bucks =35L ; 注:在这两个赋值中,编译器首先将常量用相应的转换构造函数变成account对象(临时对象),然后再将这个对象赋值给account对象Bucks. 例2:设一函数,参数为account对象。 void disp (account count) 注:由于定义了两个account转换构造函数,所以可以向这个函数传递double值,long值或account对象。 * 第14章 * 例3:减化为不同操作数而编写的操作符函数。 目前的account类有三个operator +函数。 Class account { public: account operator +(const account count) { return account (dollars + count.dollars , cents + count.cents) ;} account operator +(long dol) { return account (dollars +dol , cents) ;} friend account operator +( long dol , const account count); }; account operator +(long dol , const account count) { return (dol +count.dollars , count.cents); } * 第14章 * 若有将long值转换为类对象的转换构造函数account(long dol ,int cents=0),则可消除两个成员operator + 函数。 class account { public: account (long dol,int cen=0) {dollars = dol; cents =0;} account (double dolandcen) {dollars = long (dolandcen); cents =int((dolandcen-dollars)*100.00+0.5);} friend account operator +(const account count1, const account count2); }; * 第14章 * account operator +( const account count1 , const account count2) { return (count1.dollar +count2.dollars , count1.cents +count2.cents);} 简化后便可做下列操作: account Bucks1(39,95) ; account Bucks2(149,85) ; account Bucks3 ; Bucks3 = Bucks1+Bucks2 ; Bucks3 =Bucks1+10L ; //用转换构造函数,先将long转换为account对象,再调用operator +friend函数将两个对象相加。 Bucks2 =15L +Bucks1 ; * 第14章 * 此外,由于有double参数的转换构造函数,所以还可处理。 Bucks3 = Bucks2 +29.51 ; Bucks3 = 87.64 +Bucks1 ; 注:编写转换构造函数的一个很大的好处是,可以大大增加类中定义的重载操作符的利用。从而避免因为操作数组合不同而要重载编写运算符函数。 * 第14章 * 初始化数组 有了复制构造函数和转换构造函数,使得对象数组的初始化可以多样化。 例: account Money(95,34) ; account Moneytable [5]={ Money , //用对象初始化Moneytable [0] account(15,94) //用临时对象初始化Moneytable [1] 1

文档评论(0)

1亿VIP精品文档

相关文档