运算符重载的另外一个解决方案:类型转换 - huangzheguyun的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/huangzheguyun/article/details/6466646程序员
类型转换是任何一种语言都提供的机制。C++对内置类型的转换是比较宽松的。只要是类型兼容的转换都是容许的。向能够将double赋给一个Int。由于他认为两者都是数值。God。在Java中,这是想都不敢想。固然你强制转换除外。函数
类型转换有两种:自动转换跟强制转换。上面提到的内置类型的转换就是自动转换。.net
如今有一个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。存在二义性。blog
原本写到这里就能够结束了,可是有好事分子说:double能够转换为Pound,那Pound可否转换为double呢?答案是确定的,不过就要进行运算符的重载,什么运算符?类型转换运算符咯。ci
在Pound类中定义形如:operator double(),注意如下几点:get
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,而后进行加操做。