跳到主要内容

运算符重载的三种方式?

参考答案:

在C++中,运算符重载可以通过三种主要方式来实现:

  1. 成员函数重载:在类定义中,可以将运算符重载为类的成员函数。这种方式中,运算符的第一个操作数总是类的实例。例如:
class Complex {
public:
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

    // 重载 + 运算符作为成员函数
    Complex operator+(const Complex& c) const {
        return Complex(real + c.real, imag + c.imag);
    }

private:
    double real, imag;
};
  1. 友元函数重载:通过将运算符重载函数声明为类的友元函数,可以实现运算符的两个操作数都不是类实例的情况。友元函数可以访问类的私有和保护成员。例如:
class Complex {
public:
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

    friend Complex operator+(const Complex& a, const Complex& b);

private:
    double real, imag;
};

Complex operator+(const Complex& a, const Complex& b) {
    return Complex(a.real + b.real, a.imag + b.imag);
}
  1. 全局函数重载:运算符也可以被重载为全局函数,但这种方式不如前两种常用。全局函数重载的运算符的第一个操作数必须是类类型的实例,而第二个操作数可以是任何类型。例如:
class Complex {
public:
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

    double real, imag;
};

Complex operator+(const Complex& a, double b) {
    return Complex(a.real + b, a.imag);
}

在重载运算符时,应确保重载的运算符行为符合直觉和一致性,避免引起混淆或误解。同时,也应避免过度使用运算符重载,因为这可能会使代码难以理解和维护。