运算符重载作为成员函数

Operator Overloading as member function

为什么会报错。

 class Complex{
    int real,imaginary;
    public:
    Complex():real(0),imaginary(0){};
    Complex(int real, int imaginary):real(real),imaginary(imaginary){};
    int getreal()const{return real;}

    int getimaginary()const{return imaginary;};
    Complex &operator=(const Complex& );
    Complex operator*(){
      return Complex(real,-imaginary);
    }
    Complex  operator+(const Complex &a, const Complex &d){

      return  Complex (d.getreal()+a.getreal(),a.getimaginary()+d.getimaginary());
    }


  };

尝试重载赋值运算符时。 Eroor 说:参数太多

我们可以将哪些运算符重载为成员函数,哪些不可以

将重载运算符定义为成员函数时,this指针指向的对象隐式为第一个参数。所以你的运算符重载需要看起来像:

class Complex {
  // ...
  Complex  operator+(const Complex &d) const {
    return  Complex (real + d.real, imaginary + d.imaginary);
  }
};

请注意,您不需要 getter 函数,因为您已经可以访问 class.

中的数据成员

class 之外,即作为非成员函数,您的重载运算符完全没问题。

当重写具有左右参数的运算符时,您应该只传递右参数并像这样声明它:

Complex operator+(const Complex &d){
    return Complex(d.getreal() + getreal(), getimaginary() + d.getimaginary());
}

这样做时,当您调用 getreal() 或直接访问该变量而不指定参数时,它将使用运算符的左参数。

一些不能重载的运算符是范围 (::)、三元 (:)、sizeof、成员访问 (.) 和其他一些。