不同类数据间的转换

前言:c++保留了C语言的标准类型数据间的转换,如(类型名)数据,同时c++在保留这种用法 的同时还有另外一种用法 :类型名(数据),提倡在c++中后者的用法。

#include<iostream>
using namespace std;
class complex{
public:
complex(){real=0;imag=0;}
complex(double r){real =r;imag=0;}//转换构造函数
complex(double r,double i){real = r;imag=i;}
friend complex operator+(complex c1,complex c2);//重载运算符“+”的友元函数
void display();
private;
double real;
double imag;
};
complex operator+(complex c1,complex c2){//定义运算符“+”重载函数
return complex(c1.real+c2.real,c1.imag+c2.imag);
}
void complex::display(){//定义输出函数
cout<<"("<<real<<","<<imag<<"i)";
}
int mian(){
complex c1(3,4), c2(5,-10), c3;
c3=c1+2.5;//复数与double数据相加
c3=c1+c2;
c3.display();
return 0;
}

转换构造函数:将double的参数转换成complex类的对象

                         注意:转换构造函数只能有一个参数

类型转换函数:与转换构造函数不同的是,此函数作用是将一个类的对象转换成另一个类型的数据

                          operator 类型名(){实现转换的语句};   在编译过程中由系统自动调用且为隐式调用。

代码解释

1.c3=c1+2.5;//不同类对象相加,调用了“+”的重载,编译系统将c1+2.5解释为operator+(c1,2.5),由于2.5不属于complex类,即调用转换构造函数complex(2.5),即上面的函数调      用相当于operator+(c1,complex(2.5)。

2.上面程序如果没有转换构造函数将会出错,因为没有重载运算符能将complex类对象与double类     对象相加,如果在此基础上增加类型转换函数系统编译会出错,因为系统在运行时不知道该调用     哪一个,即出现二义性。

关于转换构造函数及类型转换函数的补充

定义double型变量 d1,d2,complex型对象c1,c2

1.d1=d2+c1;编译系统发现“+”的左边为double型,右边为complex型,检查有无,有无对“+”进行重                      载,有无类型转换函数,即将complex转换为double型建立一个临时的double数据,                      然后与d2相加后赋值给d1。

2.c2=c1+d2;在complex类中声明了重载运算符“+”函数作为友元函数,要求两个complex类的形                          参,而现在d2不符合条件,系统会去检查有无类型转换函数,发现存在转换构造函数

                    即调用complex(d2),建立一个临时的complex类对象,在调用operator+,将两个复                        数相加后赋值给c2。

3.类型转换和构造转换同时存在有可能存在二义性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值