为什么运营商有时是独立的,有时是类方法?

时间:2009-12-07 19:12:56

标签: c++ operator-overloading

为什么有时将操作符覆盖定义为类中的方法,如

MyClass& MyClass::operatorFoo(MyClass& other) { .... return this; };

有时这是一个单独的功能,比如

MyClass& operatorFoo(MyClass& first, MyClass& bar)

他们是等同的吗?当你以某种方式做到这一点以及当你做另一种方式时,有什么规则来管理?

3 个答案:

答案 0 :(得分:10)

如果您希望能够执行3 + obj之类的操作,则必须定义一个免费(非成员)运算符。

如果您想让您的运营商受到保护或私有,您必须制作方法。

某些运算符不能是自由函数,例如operator->

这已在这里得到解答:

difference between global operator and member operator

答案 1 :(得分:5)

如果你有像+这样的二元运算符,通常需要在两个操作数上执行类型转换。例如,字符串连接运算符需要能够将其操作数中的一个或两个从char *转换为字符串。如果是这种情况,则它不能是成员函数,因为左手操作数将是* this,并且不会执行转换。

E.g:

operator+( a, b );  // conversions performed on a and b
a->operator+( b );  // conversion can only be performed on b

答案 2 :(得分:1)

如果操作符在类之外定义,则认为是全局操作符,并允许您在操作符的左侧显示其他类型。

例如,给定一个类Foo,使用全局运算符+,您可以这样做:

Foo f;
Foo f2 = 55 + f;