我读到声明为成员函数的重载运算符是不对称的因为它只能有一个参数,而另一个自动传递的参数是this
指针。因此不存在比较它们的标准。另一方面,重载运算符声明为friend
is 对称的因为我们传递了两个相同类型的参数,因此可以对它们进行比较。
我的问题是,当我仍然可以将指针的左值与引用进行比较时,为什么朋友是首选? (使用非对称版本可得到与对称版本相同的结果)
为什么STL算法只使用对称版本?
如果将运算符重载函数定义为成员函数,则编译器会将表达式转换为s1 + s2
into s1.operator+(s2)
. 这意味着,运算符重载的成员函数将在第一个操作数上调用。这就是成员函数的工作原理!
但是如果第一个操作数不是类怎么办?如果我们想要重载第一个操作数不是类类型的运算符,那么就会出现一个主要问题double
.所以你不能这样写10.0 + s2
。但是,您可以为表达式编写运算符重载成员函数,例如s1 + 10.0
.
为了解决这个问题ordering问题,我们将运算符重载函数定义为friend
如果需要访问private
成员。Make it friend
仅当需要访问私有成员时。否则就简单地做到非好友 非会员功能为improve封装!
class Sample
{
public:
Sample operator + (const Sample& op2); //works with s1 + s2
Sample operator + (double op2); //works with s1 + 10.0
//Make it `friend` only when it needs to access private members.
//Otherwise simply make it **non-friend non-member** function.
friend Sample operator + (double op1, const Sample& op2); //works with 10.0 + s2
}
阅读这些:
操作数排序的一个小问题
非成员函数如何改进封装
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)