📜  C++ |运算符重载|问题4(1)

📅  最后修改于: 2023-12-03 15:29:52.081000             🧑  作者: Mango

C++ 运算符重载问题4

在 C++ 中,可以重载运算符以实现自定义类型的操作。本文将讨论运算符重载遇到的第四个问题。

问题描述

当我们需要在类中重载运算符时,应当将运算符重载函数作为类的成员函数,以便能够访问类的私有成员。但是,在使用运算符时,我们有时候希望实现对称性,即运算符作用对象的顺序可以交换,但是如果我们只定义类成员函数,无法实现对称性。

解决方案

为了解决这个问题,我们可以重载运算符作为全局函数。在这种情况下,我们可以有两个参数,并对参数顺序没有限制,因为这是一个普通函数,而不是一个类成员函数。例如:

class my_class {
public:
    my_class(int a): num(a) {}
    int get_num() const { return num; }

private:
    int num;
};

// 重载运算符作为全局函数
my_class operator+(const my_class& a, const my_class& b) {
    return my_class(a.get_num() + b.get_num());
}

int main() {
    my_class a(1), b(2);

    // 使用全局函数重载的运算符
    my_class c = a + b;

    return 0;
}

在上面的示例中,我们将 operator+ 作为全局函数重载,可以实现对称性。因此,我们可以交换两个操作数的顺序,例如,我们可以这样写:my_class c = b + a;

总结

当需要实现操作的对称性时,应当将运算符重载作为全局函数。这是因为全局函数可以接受两个参数,并且参数的顺序没有限制,但是类成员函数只能够接受一个参数,并且参数必须是类本身的对象。