转换构造函数:将其他类型的数据转换成类的对象
类型转换函数:将一个类的对象转换成其他类型的数据
1 举例分析
假设已经定义的d1,d2为double型变量,c1,c2为Complex类对象,如果类中还定义了类型转换函数
以下表达式
d1=d2+c1;
+的左边是double类型,右边是Compplex类型
(1)先检查是否有运算符重载,(么有)
(2)先检查有无类型转换函数(有)
所以将comlex类型数据转换成double最后赋值给d1;
假如定义了运算符的重载(俩个complex而没有对double进行重载)和转换构造函数,但没有定义类型转换函数
系统会使用转换构造函数将double类型转换成complex类
2 使用类型转换函数将double类型数据与complex数据相加(已知两个double 的数据可以直接相加)
#include <iostream>
using namespace std;
class Complex//定义一个复数类
{
private :
int imag;
int real;//私有数据实部虚部
public:
Complex() {real=0;imag=0 ;};//默认构造函数初始化
Complex(int a,int b)
{
real=a;
imag=b;//有参数的构造函数初始化
}
operator double()
{
return real;//定义类型转换函数
}
};
int main()
{
Complex c1(3,4), Complex c2(3,5),Complex c3;//定义对象
double d;
d=3.5+c1;
cout<<d<<endl;
return 0;
}
分析
假如没有类型转换函数,系统是会报错的因为complex的数据类型不能和double的数据类型直接相加
假如定义重载函数可以使得两个复数类型相加
则
(1) c3=c2+c1;//是可以正常运行的
假如有如下
(2)d=c1+c2;//等号右边是可以直接相加得到复数类型的,等号左边是复数类型,但是又有类型转换函数所以可以将相加后的数据转换成double赋值给左侧;
3 包含运算符承载函数和类型转换函数的程序
#include <iostream>
using namespace std;
class Complex
{
private :
double imag;
double real;
public :
Complex(){ real=0;
imag=0;
}
Complex(double a,double b) {
real=a;
imag=b;
}
Complex(double r) { real=r;
imag=0;
} //转换构造函数
void display();
friend Complex operator +(Complex c1,Complex c2) ;//声明为友元函数的运算符重载
};
void Complex::display()
{
cout<<"real="<<real<<","<<"imag="<<imag<<endl;
}
Complex operator+(Complex c1,Complex c2)
{
return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
int main()
{
Complex c1(3,4),c2(4,5),c3;
c3=c1+2.3;
c3.display();
return 0;
}
如果没有定义转换构造函数,系统编译会出错,因为没有重载complex和double的数据相加,此过程中,系统先调用转换构造函数然后在运行
注意;在已经定义转换构造函数的情况下+重载为友元函数可以进行交换律但是若为成员函数则是不可以的
假如一定要重载为成员函数的同时实现交换律,只有一个办法可以解决,就是再重载一个+函数,但是函数必须为友元函数
若在上述程序中增加类型转换函数
operator double(){return real;}
程序在运行的时候会出错,原因是出现了二义性,一种方法是调用转换构造函数把2.3变成complex对象再调用重载+,另一种理解是把c1转换成double类型然后相加系统无法判定,这两者是矛盾的