王江洋
  • 1
  • 新人请关照

c++中重载问题,为何"+"不能连续用?

#include <iostream>
#include <string>
using namespace std;
class Complex                         
{
    double real,imag;               
public: 
    Complex(double r,double i):real(r),imag(i){}       
    void display(const string &name)
    {cout << name << real << "," << imag << "i" << endl;}
    friend Complex& operator+(Complex &c1,Complex &c2);
};
Complex& operator+(Complex &c1,Complex &c2)     
{
    Complex c;
    c.real = c1.real + c2.real;
    c.imag = c1.imag + c2.imag;
    return c;
}
int main()
{
    Complex c1(1,1),c2(2,2),c3;
    c3 = c1 + c2;                         
    c3 = c3 + c1;             //为何这两行不能写成c3=c1+c2+c1?
    c3.display("c3 = ");
    system("pause");   return 0;
}
阅读 276
评论
    1 个回答
    fefe
    • 8.2k
    Complex& operator+(Complex &c1,Complex &c2) 
    {
    
        Complex c; // <---- Complex 没有默认构造函数
        c.real = c1.real + c2.real;
        c.imag = c1.imag + c2.imag;
        return c; // <---- 不要返回局部变量的引用 !!!!
    }
    1. 不能返回局部变量的引用。
      这里返回值应该是 Complex (没有引用)
    2. 返回值改成 Complex 之后,c1+c2+c1 会编译不通过。
      因为,operator+ 的返回(c1+c2的返回值)是一个临时对象,它不能绑定到 Complex & 上,继续调用 operator+(Complex&, Complex&)
      这里,需要把 operator + 的两个参数改为 const Complex& ,就可以接受临时对象了,从而可以使用 c1+c2+c1
    评论 赞赏