C++运算符覆盖 - 为什么首选朋友
C++ operator override - why is it friend preferred?
继续上一个问题,我想问为什么首选C++运算符覆盖中的"朋友"加法形式
总结一下:
对于加法运算符覆盖,有两种方法可以做到这一点:
int operator+(Object& e);
friend int operator+(Object& left, Object& right);
为什么首选第二种(朋友)形式?有哪些优势?
非成员版本(友元或其他版本)是首选版本,因为它可以支持运算符左侧和右侧的隐式转换。
给定一个可隐式转换为 Object 的类型:
struct Widget
{
operator Object() const;
};
如果左侧出现Widget
实例,则只能调用非成员版本:
Widget w;
Object o;
o + w; // can call Object::operator+( Object & ) since left-hand side is Object
w + o; // can only call operator+( Object &, Object & )
回应您的评论:
通过在 Widget
中定义转换运算符,我们通知编译器Widget
的实例可以自动转换为 Object
的实例。
Widget w;
Object o = w; // conversion
在表达式o + w
中,编译器使用将w
转换为Object
生成的参数调用Object::operator+( Object & )
。 所以结果和写o + w.operator Object()
一样。
但是在表达式w + o
中,编译器查找Widget::operator+
(不存在)或非成员operator+( Widget, Object )
。 后者可以通过将w
转换为上述Object
来调用。
该规则不是通用的:当您实现采用两个相同类型的参数的逻辑对称操作时,首选friend
版本,例如您的帖子演示的情况。
此实现强调了操作真正对称的事实:它不是向自身添加Object e
的"对象这个"——而是lhs
和rhs
的添加。
在操作非对称的情况下 - 例如,当您向迭代器添加int
时,您应该首选实现运算符的第一种方法,即
Object& operator+(int& offset);
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 为什么C++需要公共继承,忽略朋友声明,才能使动态向下工作?
- C++:为什么不使用朋友作曲
- 为什么我们在这里创建朋友函数.C
- 为什么我的朋友操作超载代码将输出算出为零
- 为什么在类定义中定义朋友函数
- 为什么我需要将此朋友函数的定义包装在名称空间中
- 朋友功能是否继承?为什么基类朋友功能在派生的类对象上工作
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员<<这是一个iStream运算符
- 沿类层次结构的私人继承,为什么在整个层次结构中都需要朋友
- 为什么 GCC 不允许在你是朋友时从私有嵌套类继承
- C++运算符覆盖 - 为什么首选朋友
- 为什么它的朋友无法访问这个私有构造函数