重载<<运算符

Overloading the << operator

本文关键字:lt 运算符 重载      更新时间:2023-10-16

我刚刚写了一个复数类,你可以看到它的代码如下;假设a和B是复数,我的问题是,当我写代码:

cout & lt; & lt;A + B;//它给我一个错误

但是当我将A+B赋值给Complex类的实例时,比如C,它可以正常工作。我的意思是:

Complex C=A+B <<endl;cout & lt; & lt;C;//运行正常

我真的很困惑为什么我不能使用A+B作为<<的右操作数操作符。我怎么能直接算出A+B呢?提前感谢你的帮助。以下是我目前想到的:

   #include <iostream>
   using namespace std;
class Complex {
     private:
        double real;
        double image;
     public:
    Complex(double r, double i){ real=r ; image=i;}
    int GetReal(){ return real;}
    int GetImage(){return image;}

    //overload complex + complex
    friend Complex operator+(const Complex &c1,const Complex &c2) ;
    //overload complex + double
    friend Complex operator+(const Complex &c,double Number) ;
    //overload double + complex
    friend Complex operator+(double Number,const Complex &c) ;
    //overload complex * complex
    friend Complex operator*(const Complex &c1, const Complex &c2);
    //overload complex * double
    friend Complex operator*(const Complex &c, double Number);
    //overload double * complex
    friend Complex operator*(double Number, const Complex &c);
    //overloading output operator
    friend ostream& operator<< (ostream &out, Complex &c);
 };
Complex operator+(const Complex &c1,const Complex &c2){
     return Complex(c1.real + c2.real,c1.image + c2.image);}
Complex operator+(const Complex &c,double Number){
     return Complex(c.real + Number , c.image);}
Complex operator+(double Number,const Complex &c){
     return Complex(Number + c.real,c.image);}
 //(a + bi) * (c + di) = ((ac-bd) + (ad+bc)i)
Complex operator*(const Complex &c1, const Complex &c2){
     return Complex(c1.real*c2.real-c1.image*c2.image,c1.real*c2.image+c1.image*c2.real);}
Complex operator*(const Complex &c, double Number){
     return Complex(c.real*Number,c.image*Number);}
Complex operator*(double Number, const Complex &c){
     return Complex(Number*c.real,Number*c.image);}
ostream& operator<< (ostream &out, Complex &c){
     if( c.image>0){
          out << c.real << "+ " <<
                c.image << "i";}
     else if (c.image==0){
          out<<c.real;
       }
     else { out<< c.real<<"- "<<
             c.image<< "i";}
     return out;}
int main(){
Complex A(1,2);
Complex B(3,4);
cout<<"A is: "<<A<<endl;
cout<<"B is: "<<B<<endl;
Complex c=A+B;
cout<<c<<endl;  //works correctly
cout<<A+B<<endl;  // gives an Error ?!

}

A+B是右值,因为您的operator+(正确地)按值返回。不能将非const左值引用绑定到右值。您需要将操作符更改为const参考:

friend ostream& operator<< (ostream& out, const Complex& c);
                                          ^^^^^

需要形参是const引用,而不是可变引用。也就是说,将operator<<的定义和声明中的Complex& c更改为const Complex& c,它应该可以工作。这样做的原因是临时结果(如a + b)不能修改,而命名的非const变量可以修改。