运算符重载的另一个解决方案:类型转换

类型转换是任何一种语言都提供的机制。C++对内置类型的转换是比较宽松的。只要是类型兼容的转换都是允许的。向可以将double赋给一个Int。因为他认为二者都是数值。God。在Java中,这是想都不敢想。当然你强制转换除外。

类型转换有两种:自动转换跟强制转换上面提到的内置类型的转换就是自动转换。

现在有一个Pound类,用以保存重量,当然他包含一个double类型的成员变量num,记录有多少磅。好了,如果他有一个构造函数,形如:Pound(double num)。那么编译器就可以进行隐式的类型转换。即当有语句,Pound p= 12.5时,程序是可以正常运行的,过程如下:首先,Pound(12.5 )被调用来创建一个临时的Pound对象,然后通过逐成员赋值方式将这个对象拷贝给P。(这里有一个隐式赋值运算符重载的知识点,以后会说)

自动转换很nice,但是有时候它会导致程序出现意外的类型转换,如果关闭这种自动转换的特性,可以使用关键字ecplicit,即将其加在Pound(double num)的前面,如explicit Pound(double num)。这样就关闭了自动转换,但是仍然可以使用强制转换,即Pound(12.5)或(Pound)12.5。

还有一点值得注意的是,如果被转换值是int,它将先被转换为double,然后再转换为Pound。也就是说,所有兼容的类型都能进行这种二步转换。但是,如果类还定义了另外一个构造函数Pound(long num)编译器将报错,因为int既可以转换成double,也可以转换为long。存在二义性。

本来写到这里就可以结束了,但是有好事分子说:double可以转换为Pound,那Pound能否转换为double呢?答案是肯定的,不过就要进行运算符的重载,什么运算符?类型转换运算符咯。

在Pound类中定义形如:operator double(),注意以下几点:

1.转换函数一定是类方法

2.转换函数不能指定返回类型,因为类名已经说明了。

3.转换函数不能有参数。

不过必须说明一点的是:这种类型转换运算符的重载,并不是一种好想法。因为explicit关键字不能用于转换函数,也就是说程序中可能会出现许多无法预测的自动转换。因此,最好是利用一种非转换函数的类函数来代替它:如toDouble()。看看Java里大量的toString就明白了,人家的确是用心良苦啊。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

写到最后,才进入了本篇日志的主题:运算符重载的解决方案:

上篇提到,运算符重载可以使用友元函数,即以下这种定义形式:(本例是Pound类的+操作)

Pound operator +(double d);

friend Pound operator +(double d,Pound p);

而第二种方法就是利用类型转换,即:

定义一个友元函数即可:

friend operator +(Pound p1,Pound p2);

Pound::Pound(double d);

这样,在+操作中,不管第一还是第二操作数是一个double类型,他都将先被类型转换成一个Pound,然后进行加操作。

两种方法的优劣对比:第一种方法定义的方法多,程序员需要做更多的事情,但是运行速度较快。因为省去了类型转换的开销。第二种方法就刚好相反。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值