为什么有时将操作符覆盖定义为类中的方法,如
MyClass& MyClass::operatorFoo(MyClass& other) { .... return this; };
有时这是一个单独的功能,比如
MyClass& operatorFoo(MyClass& first, MyClass& bar)
他们是等同的吗?当你以某种方式做到这一点以及当你做另一种方式时,有什么规则来管理?
答案 0 :(得分:10)
如果您希望能够执行3 + obj
之类的操作,则必须定义一个免费(非成员)运算符。
如果您想让您的运营商受到保护或私有,您必须制作方法。
某些运算符不能是自由函数,例如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;