学习谭浩强《C++程序设计》运算符重载章节时遇到了以下问题:
在自定义类Complex中定义了类型转换构造函数,同时,定义了以Complex类对象的引用为形参的运算符+重载的友元函数,在执行类型隐式转换时出错。
错误代码如下:
#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)"<<endl;} int main() { Complex c1(3,4),c2(5,-10),c3; c3=c1+2.5; c3.display(); return 0; } 其实是类型对应发生了错误。 修改方法一:只需把 friend Complex operator+(Complex &c1,Complex &c2); //运算符重载的友元函数 Complex operator+(Complex &c1,Complex &c2) //定义运算符+重载的函数这两句代码中的引用符号“&”删去即可。
修改方法二:
显式调用转换函数:
c3=c1+Complex(2.5);
参考:http://bbs.bccn.net/thread-350819-1-1.html