运算符==是成员函数或朋友函数,

operator== be a member function or a friend function,?

本文关键字:函数 朋友 成员 运算符      更新时间:2023-10-16

是否有好处或强制使operator==operator<operator>operator<<operator>>!=>=。。。作为朋友而不是一个类的方法?

我还没有找到一个好的文本来解释为什么只去朋友的方式。。。

如果C1 x; C2 y; C3 z;C3& operator+(C1& , C2&)在C1和C2中是朋友,即当类不同时,我有一个很好的用例,但问题是为什么是同一个类。

独立函数的参数是,这些运算符应根据操作数类型对称。当类具有允许将左手操作数隐式转换为类类型的构造函数时,将关系运算符实现为独立函数而不是方法可能会带来好处。否则,您将不得不编写显式构造函数调用,或者为其他左操作数类型重载运算符(组合爆炸)。

只有当您必须有权访问类的成员时,才需要友元声明。由于关系运算符通常不会更改其操作数,因此在大多数情况下,还有其他读取成员的方法。

不要过度使用运算符重载。特别是,当你的问题中有很多类类型,比如C1、C2、C3时,很快就会变得不清楚,尤其是对于其他开发人员来说,你的运算符意味着什么。考虑用一个能清楚描述你意图的名字来举办一个活动。

如果类具有关系语义,则将关系运算符作为类的一部分。另一方面,如果您只需要像<这样的东西来为某个容器对类进行排序,那么您可能更喜欢编写一个单独的自由函数来明确定义该容器,而不是暗示这与类的语义有关(或者您可以专门为类指定std::less)。

对于二进制移位运算符<<>>,您可能没有选择,因为只有当您的类对象是运算的第一个参数时,才会选择成员函数。除此之外,我还会给出同样的建议,并且只有当成员运算符在某种程度上是类语义的内在操作时,我才会生成该运算符,而不是为了帮助其他一些无关的目的。

Friend函数是首选函数,因为它们允许在以下情况下使用该函数:

bool b = (12345 == myObj);

如果operator==被定义为成员函数,这将导致编译器错误。