词条 | 转换构造函数 |
释义 | 在C++中,类的构造函数可以省略不写,这时C++会为它自动创建一个隐式默认构造函数(implicit default constructor);也可以由用户定义带参数的构造函数,构造函数也是一个成员函数,他可以被重载;当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。 例如: 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的对象作为参数。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。