
 
文章目录
- 回答重点:
- 示例:
 
- 运算符重载的基本规则和注意事项:
 
回答重点:
C++的运算符重载是指可以为自定义类型(如类或结构体)定义运算符的行为,使其像内置类型一样使用运算符。通过重载运算符,开发者可以对类对象使用常见的运算符(如+, -, *, ==, []等),并为它们赋予特定的操作逻辑。
- 重载的运算符仍然遵守其原有的优先级和结合性。
- 重载必须是通过类成员函数或友元函数实现。
- 不能重载的运算符:::、.*、.:、sizeof、typeid、const_cast等。
示例:
class Complex {
public:
    int real, imag;
    Complex(int r = 0, int i = 0) : real(r), imag(i) {}
    // 重载 + 运算符
    Complex operator + (const Complex &obj) {
        return Complex(real + obj.real, imag + obj.imag);
    }
};
重载+后,以下代码就可以正常工作:
Complex a(1.0, 2.0);
Complex b(3.0, 4.0);
Complex c = a + b; // 使用重载的+运算符
运算符重载的基本规则和注意事项:
-  只能重载已有的运算符,不能创建新的运算符。 
 比如+运算符可以重载,但不能创建一个新的运算符。
-  不能改变运算符的优先级、结合性和内在语义。 
 重载只改变运算符的操作对象和行为,但在表达式中的优先级和结合性是固定的,也不能改变其在基本类型上的预期行为。例如,不能让+运算符变成减法。
-  有些运算符不能被重载。 
 比如.(成员访问运算符)、?:(三元条件运算符)等不能被重载。但是大多数运算符符合相应的规定都可以重载。
-  运算符重载可以作为成员函数或全局函数。 
 作为成员函数时,第一个参数隐含为this指针。如果需要对两个不同类型的对象进行操作,通常会使用全局函数形式重载,同时全局函数形式需要使用友元声明访问类的私有成员。
class Complex {
public:
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
    // 声明为友元函数,使其访问私有成员
    friend Complex operator+ (const Complex& lhs, const Complex& rhs);
private:
    double real;
    double imag;
};
// 作为全局函数重载 + 运算符
Complex operator+ (const Complex& lhs, const Complex& rhs) {
    return Complex(lhs.real + rhs.real, lhs.imag + rhs.imag);
}
- 运算符重载要确保符合逻辑和直观,以免造成困惑。例如,==运算符通常用于比较对象是否相等,那么它的返回值应该是一个布尔值。



















