gpt4 book ai didi

C++ 运算符覆盖 - 为什么它是 friend 首选?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:07 27 4
gpt4 key购买 nike

继续 previous question我想问一下为什么首选 C++ 运算符覆盖中的“ friend ”形式的加法

总结:

对于加法运算符覆盖有两种方法:

int operator+(Object& e);
friend int operator+(Object& left, Object& right);

为什么首选第二种( friend )形式?有什么优势?

最佳答案

首选非成员版本(友元或其他版本),因为它可以支持运算符左右两侧的隐式转换。

给定一个可以隐式转换为 Object 的类型:

struct Widget
{
operator Object() const;
};

如果 Widget 的实例出现在左侧,则只能调用非成员(member)版本:

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 中,编译器调用 Object::operator+( Object & ) 并通过将 w 转换为一个对象。所以结果和写 o + w.operator Object() 是一样的。

但是在表达式 w + o 中,编译器查找 Widget::operator+(不存在)或非成员 operator+(小部件,对象)。后者可以通过将 w 转换为上面的 Object 来调用。

关于C++ 运算符覆盖 - 为什么它是 friend 首选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12765186/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com