重载操作符作为成员函数还是非成员(朋友)函数?

Set*_*eth 10 c++ function operator-overloading friend

我目前正在创建一个实用程序类,它将在其中重载运算符.使它们成为成员或非成员(friend)函数的利弊是什么?或者它是否重要?也许这是一个最好的做法?

Tob*_*ner 20

我将使用"C++编码标准:101规则,指南和最佳实践":如果您可以将其作为非成员函数执行,则将其作为非成员函数(在同一名称空间中)执行.

其中一个原因是:它在隐式类型转换中效果更好.示例:您有一个带有重载运算符*的复杂类.如果要编写2.0*aComplexNumber,则需要operator*作为非成员函数.

另一个原因:耦合较少.非成员函数与成员函数的耦合程度较低.这几乎总是一件好事.


On *_*und 16

每个运营商都有自己的考虑因素 例如,<<运算符(用于流输出,而不是位移)将获取ostream作为其第一个参数,因此它不能是您的类的成员.如果您正在实施加法运算符,您可能希望从双方的自动类型转换中受益,因此您也将与非成员一起使用等...

至于允许通过继承进行专门化,常见的模式是根据虚拟成员函数实现非成员运算符(例如,operator <<在被传递的对象上调用虚函数print()).


Mat*_* M. 5

如果您计划实现流运算符(<< 和 >>),那么它们将是非成员方法,因为您的对象位于运算符的左侧。

如果你打算实现 ->, () 或 [] 它们自然是成员方法。

对于其他(比较和数学),您应该查看Boost.Operators,它确实有帮助。

例如,如果要实现以下运算符:

MyClass& MyClass::operator+=(int);
MyClass operator+(const MyClass&, int);
MyClass operator+(int, const MyClass&);
Run Code Online (Sandbox Code Playgroud)

你只需要写:

class MyClass: boost::operator::addable<MyClass,int> // no need for public there
{
public:
  MyClass& operator+=(int);
private:
};
Run Code Online (Sandbox Code Playgroud)

2operator+将自动生成为非会员,这将使您受益于自动转换。并且它们将被有效地实现,operator+=因此您只需编写一次代码。