运算符重载:成员函数与非成员函数?
我读到一个声明为成员函数的重载运算符是非对称的,因为它只能有一个参数而另一个自动传递的参数是
this
指针。所以没有比较它们的标准。另一方面,声明为friend
的重载运算符是对称的,因为我们传递两个相同类型的参数,因此可以对它们进行比较。
我的问题是,当我仍然可以将指针的左值与参考值进行比较时,为什么会选择朋友? (使用非对称版本提供与对称相同的结果)
为什么STL算法只使用对称版本?
没有找到相关结果
已邀请:
2 个回复
稍惮
的表达式转换为
。这意味着,在第一个操作数上调用运算符重载的成员函数。这就是会员功能的运作方式! 但是如果第一个操作数不是一个类呢?如果我们想要重载第一个操作数不是类类型的运算符,而不是
,则会出现一个主要问题。所以你不能这样写
。但是,您可以为像
这样的表达式编写运算符重载的成员函数。 为了解决这个排序问题,我们将运算符重载函数定义为
如果它需要访问
成员。只有在需要访问私人会员时才能成为
。否则只需使其非朋友非成员函数来改善封装!
阅读这些: 在操作数中排序的一个小问题 非成员函数如何改进封装
坊岔埠绵
运算符重载和成员函数运算符重载,因为它在全局运算符重载和成员函数运算符重载之间。 偏好全局运算符重载的一个原因是,如果要允许类型出现在二元运算符右侧的表达式。例如:
这仅适用于全局运算符重载的情况 Foo运算符+(int x,const Foo& f); 请注意,全局运算符重载不一定需要是
函数。只有在需要访问
的私人成员时才需要这样做,但情况并非总是如此。 无论如何,如果
只有一个成员函数操作符重载,如:
...那么我们只能在加号运算符左侧出现一个
实例的表达式。