【发布时间】:2020-07-06 11:57:09
【问题描述】:
我试着查阅了这本书,发现那里的原因是运算符函数的原型要重载
friend ostream& operator<<(ostream&, const className&);
现在考虑以下语句:
cout << myRectangle << yourRectangle;
这个语句等价于语句:
operator<<(operator<<(cout, myRectangle), yourRectangle); //Line A
因为运算符
cout << myRectangle
即表达式:
operator<<(cout, myRectangle)
执行此表达式后,输出 myRectangle 的值,无论是什么 函数运算符
这意味着你不能通过值传递一个对象作为形参通过引用获取它的参数。所以对我来说为什么在重载
tempRectangle = myRectangle + yourRectangle + anyRectangle;
根据运算符的优先级和结合性,编译器会先执行:
myRectangle + yourRectangle
相当于:
myRectangle.operator+ (yourRectangle); // Line B
► 这是我的第一个困惑,在执行 B 行后,它将按值返回对象(然后由第三个对象添加,即 anyRectangle)。那么你如何根据 B 行来编写这个加法(因为我们没有任何名称返回的值返回的对象,所以它是如何执行这个加法的)。
►第二个困惑是在这个语句中添加了所有三个对象之后:
tempRectangle = myRectangle + yourRectangle + anyRectangle;
我们有一个按值返回的对象,然后将其传递给 operator= 函数以分配它 tempRectangle。现在这与
className operator+(const className&) const;
这个函数还有一个引用参数。但是我们按值传递对象作为实际参数(在重载
【问题讨论】:
-
operator=应该通过引用返回。 -
另外:
className operator+经常使用className& operator+=实现
标签: c++ oop operator-overloading return-type