📅  最后修改于: 2023-12-03 15:29:52.081000             🧑  作者: Mango
在 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;
。
当需要实现操作的对称性时,应当将运算符重载作为全局函数。这是因为全局函数可以接受两个参数,并且参数的顺序没有限制,但是类成员函数只能够接受一个参数,并且参数必须是类本身的对象。