前言: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.类型转换和构造转换同时存在有可能存在二义性。