operator+声明为成员函数时交换律问题
class Complex
{
public:
Complex() {real = 0; imag = 0;} //默认构造函数
Complex(double r) { real = r; imag = 0;} //转换构造函数
Complex(double r, double i) {real = r; imag = i;} //带参数构造函数
Complex operator+(Complex c2); ///重载‘+’运算符设为成员
void display();
private:
double real;
double imag;
};
//将运算符'+'函数重载为成员函数
Complex Complex::operator+(Complex c2)
{
return Complex(this->real + c2.real, this->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=c1.operator+(Complex(2.5)),隐式将2.5转换为对象
c3 = Complex(2.5) + c1; ///ok
c3 = 2.5 + c1; ///error?
c3.display();
return 0;
}
将运算符“+”函数重载为成员函数时,当运行c3=2.5+c1时报错,因为2.5不是类对象;而将2.5强制转换为类对象Complex(2.5)时,运行ok,为什么c3=2.5+c1这条语句2.5没有自动发生转换啊?
[解决办法]
编译器看到了一个double + 一个Complex,不知道要从后面的class成员函数里找operator +
如果把成员函数类型的operator +写成friend function就可以了
friend Complex operator+(const Complex &c1, const Complex &c2);
[解决办法]
因为如果用友元全局函数的话,第一个参数也可以接受隐式类型转换构造Complex临时对象的传入方式;
可是如果是类内置型操作符重载的话,编译器只会根据第一个参数的实际类型查找其对应的成员函数,看其是否符合匹配。
比如第一个参数是2.5,则编译器只会查找double::operator +(显然这里double只是个内置类型,不可能包含成员)。而不会考虑将double隐式转换成其他类型了