gpt4 book ai didi

c++ - 为什么我们在重载 << 运算符而不是重载 = 和 + 运算符时通过引用返回对象?

转载 作者:行者123 更新时间:2023-12-02 10:29:42 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





What are the basic rules and idioms for operator overloading?

(8 个回答)


1年前关闭。




我试图查阅这本书,我发现那里的原因是重载 << 运算符的运算符函数的原型(prototype)是:

friend ostream& operator<<(ostream&, const className&);
现在考虑以下语句:
cout << myRectangle << yourRectangle;
该语句等价于以下语句:
operator<<(operator<<(cout, myRectangle), yourRectangle); //Line A
因为运算符 << 的结合性是从左到右的。
要执行前面的语句,必须首先执行表达式:
cout << myRectangle
也就是说,表达式:
operator<<(cout, myRectangle)
在执行这个表达式之后,它输出 myRectangle 的值,不管是什么
函数运算符 << 返回的将成为
operator<<(即函数operator<<的第一个参数)为了输出
对象 yourRectangle 的值(参见 A 行中的语句)。左侧
运算符 << 的参数必须是 ostream 类型的对象,所以表达式:
cout <<我的矩形
必须将对象 cout(不是它的值)返回到第二个运算符 << in 的左侧
为了输出 yourRectangle 的值。
因此,函数 operator<< 的返回类型必须是对对象的引用
ostream 类型的。
这意味着您不能将对象按值作为参数传递,而形式参数通过引用获取它。所以对我来说为什么在重载 << 运算符时我们通过引用返回是有道理的。但我感到困惑的是在这个声明中:
tempRectangle = myRectangle + yourRectangle + anyRectangle;
根据运算符的优先级和结合性,编译器会首先执行:
myRectangle + yourRectangle
这相当于:
myRectangle.operator+ (yourRectangle); // Line B
► 这是我的第一个困惑,在执行 B 行后,它将按值返回对象(然后由第三个对象添加,即 anyRectangle)。那么如何根据 B 行编写这个加法(因为我们没有任何名称返回的那个对象,所以它是如何执行这个加法的)。
► 第二个困惑是,在此语句中添加了所有三个对象之后:
tempRectangle = myRectangle + yourRectangle + anyRectangle;
我们有一个按值返回的对象,然后将其传递给 operator= 函数以分配它 tempRectangle。现在这与 << 运算符发生的情况相同。由于 operator= 函数的原型(prototype)是:
className operator+(const className&) const;
这个函数也有一个引用参数。但是我们按值传递对象作为实际参数(在重载 << 运算符时,我们通过引用返回,因为我们必须将它传递给无法按值对象返回的引用参数,所以我们为什么不在这里做同样的事情,即通过引用返回)。

最佳答案

正如评论中提到的 operator=应该返回一个引用。另一方面operator+是不同的,因为在

auto c = a + b;
operator+通常保持两个操作数不变,结果创建一个新对象。例如
struct foo {
int value;
foo operator+(const foo& other) const {
foo result;
result.value = value + other.value;
return result;
}
};
如果您链接 operator+如在
auto c = (a + b) + c;
然后 operator+(c)均未调用 a也不是 b但根据 a+b 的结果.

关于c++ - 为什么我们在重载 << 运算符而不是重载 = 和 + 运算符时通过引用返回对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62755561/

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