C++ 为什么操作符有时是独立的,有时是类方法?

C++ 为什么操作符有时是独立的,有时是类方法?,c++,operator-overloading,C++,Operator Overloading,为什么有时操作符重写被定义为类中的一个方法,比如 MyClass& MyClass::operatorFoo(MyClass& other) { .... return this; }; 有时它是一个单独的函数,比如 MyClass& operatorFoo(MyClass& first, MyClass& bar) 它们相等吗?当您以一种方式执行操作时,以及当您以另一种方式执行操作时,哪些规则将起支配作用?如果运算符是在类之外定义的,则它被视为全局运

为什么有时操作符重写被定义为类中的一个方法,比如

MyClass& MyClass::operatorFoo(MyClass& other) { .... return this; };
有时它是一个单独的函数,比如

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

它们相等吗?当您以一种方式执行操作时,以及当您以另一种方式执行操作时,哪些规则将起支配作用?

如果运算符是在类之外定义的,则它被视为全局运算符,并允许您在运算符的左侧显示其他类型

例如,给定一个类
Foo
,使用全局运算符
+
,可以执行以下操作:

Foo f;
Foo f2 = 55 + f;

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

如果你想让你的操作符成为受保护的或者私有的,你必须让它们成为方法

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

这里已经回答了这个问题:


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

例如:


我投票决定以可能的副本(显然我的搜索结果不好)结束
operator+( a, b );  // conversions performed on a and b
a->operator+( b );  // conversion can only be performed on b