转换构造函数
在C++中,类的构造函数可以省略不写,这时C++会为它自动创建一个隐式默认构造函数(implicit default constructor);也可以由用户定义带参数的构造函数,构造函数也是一个成员函数,他可以被重载;当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。
- 中文名称 转换构造函数
- 外文名称 implicit default constructor
- 性质 计算机
- 类别 编程
简介
例如:
class Complex
{
protected:
double real,vir; //复数的实部和虚部
public:
Complex(double x)
{ real=x,vir=0;}
};
这个构造函数即 转换构造函数。
如上文。构造函数只有一个参数 double x,它也不是本类的const引用。
应用
1、转换构造函数一般由系统自动调用(当然代码里自己调用完全没问题),这点很利于编程。
例如:Complex t=5.0;//或Complex t(5.0);或Complex t=Complex(5.0);或Complex t=(Complex)5.0;
这时系统就自动调用了 Complex(double x)将 5.0转换成Complex类,再赋值给 t 。
2、如果定义了 操作符重载函数 Complex operator + (const Copmlex a ,const Complex b);
而且在Complex类中定义了类型转换函数 operator double() {.....; }。
例如类的声明如下:
class Complex
{
public:
Complex(){real=0;vir=0;}//构造函数1
Complex(double r){real=r;vir=0;}//构造函数2/转换构造函数
Complex(double r,double i):real(r),vir(i){}//构造函数3
friend Complex operator + (Complex &c1,Complex &c2);//重载"+"运算符
operator double(){return real;}//类型转换函数
private:
double real; double vir;
};
//还需在类外定义运算符重载函数operator +如下
Complex operator + (Complex &c1,Complex &c2)
{return Complex(c1.real+c2.real; c1.vir+c2.vir);}
这时,语句:
Complex b=t + 4.8;
就能直接编译通过,且4.8和t的位置可互换,即满足加法交换律,但是当编译器编译到这行语句时,不同的编译器会有不同的反应,有的编译环境下,如dev c++会把t转换为double数值,若t=1+1i则执行完此行语句后b=5.8+0i(注意类声明中的类型转换函数),此时对运算符+的重载不起作用;而有的编译器则会自动执行转换构造函数,把4.8转换为一个对象即4.8+0i,再与t相加 执行结果为b=5.8+1i,此时对运算符+的重载起作用,因为在类Complex中将运算符重载函数定义为了友元函数,这个函数需要两个Complex的对象作为参数。
若去掉类型转换函数一行,GCC编译器编译不能通过,因为Complex建立的临时对象不能转化为非const引用,只需将友元运算符函数的形参加上const就可通过编译。 即:
friend Complex operator + (const Complex &c1,const Complex &c2);