运算符==是成员函数或朋友函数,
operator== be a member function or a friend function,?
是否有好处或强制使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==
被定义为成员函数,这将导致编译器错误。
- 一位朋友将模板函数缩写为clang和gcc
- "朋友"成员函数和 GCC 与 Clang
- C++:让函数成为多个类的朋友?
- 在VS 2017中,朋友通过具有私有析构函数的结构的unique_ptr向量进行迭代失败
- 限制多模板参数朋友函数可访问的类实例的范围
- 朋友定义函数的名称空间是什么
- 朋友函数随机行为
- 如何使专用函数模板成为某个类的朋友?
- 优点和缺点 在类内为大型项目定义的内联朋友助手免费函数
- G++ 和 CLang++ 在模板类中定义了朋友模板函数的不同行为
- 使用朋友函数时,会保护变量
- 如何在CPP文件中使用朋友函数
- 成员函数作为朋友:利普曼第五本书错了吗?
- 我们如何将Ostream函数作为类的成员函数实现,而不是作为朋友函数,以便我可以用作虚拟函数
- 在模板类中编写朋友函数声明的正确方法是什么?
- 如何将指针用于朋友函数作为成员函数的参数
- 在没有朋友的情况下向私有构造函数授予访问权限
- 为什么我们在这里创建朋友函数.C
- 正确的朋友模板函数语法
- 运算符[]使用朋友函数超载