是否有好处或强制要求operator==
,operator<
,operator>
,operator<<
,operator>>
,!=
,{ {1}},...作为朋友而不是班级的方法?
我还没有找到一个好的文字,解释了为什么只有朋友的方式......
我有一个很好的用例如果>=
并且我有C1 x; C2 y; C3 z;
作为C1和C2中的朋友,即当类不同时,但问题是为什么对于同一个类。
答案 0 :(得分:2)
独立函数的参数是这些运算符应根据操作数类型对称。当您的类具有允许将左侧操作数隐式转换为类类型的构造函数时,将关系运算符实现为独立函数而不是方法可以带来好处。否则,您必须编写显式构造函数调用或为其他左操作数类型重载运算符(组合爆炸)。
如果您必须有权访问班级成员,则只需要朋友声明。由于关系运算符一般不会改变其操作数,因此在大多数情况下还有其他方法可以读取成员。
不要过度使用运算符重载。特别是,当你的问题中有很多类型如C1,C2,C3时,很快就会变得不清楚,特别是对于其他开发人员,你的运营商意味着什么。考虑使用一个名称清楚地描述您的意图的函数。
答案 1 :(得分:1)
如果您的类具有关系语义,那么将关系运算符作为该类的一部分。另一方面,如果你只需要<
这样的东西来为某个容器订购你的类,那么你可能更喜欢编写一个单独的自由函数来明确定义该容器,而不是暗示这是与课程的语义相关(或者你可以为你的班级专门研究std::less
。)
对于二元移位运算符<<
和>>
,您可能没有选择,因为仅当您的类对象是第一个参数时才选择成员函数。操作。除此之外,我会提出相同的建议,并且只有当该操作在某种程度上固有于类语义时才会成为成员运算符,而不是为了帮助其他一些不相关的目的。
答案 2 :(得分:1)
首选友方函数是因为它们允许在以下情况下使用该函数:
bool b = (12345 == myObj);
如果将operator==
定义为成员函数,则会导致编译器错误。