我试图在C ++中重载运算符。为此,我写了以下代码:
#include <iostream>
using namespace std;
class Box
{
public:
int height;
int width;
int length;
public:
Box operator+(const Box& b)
{
this->length = this->length + b.length;
this->width = this->width + b.width;
this->height = this->height + b.height;
return *this;
}
};
int main()
{
Box b1,b2;
b1.length = 5;
b1.width = 5;
b1.height = 5;
cout << "Length is : " << b1.length;
cout << "width is : " << b1.width;
cout << "height is : " << b1.height;
b2.length = 5;
b2.width = 5;
b2.height = 5;
b1 = b1 + b2 ;
cout << "Length is : " << b1.length;
cout << "width is : " << b1.width;
cout << "height is : " << b1.height;
cout << "Hello from first c++";
return 0;
}
主要部分是:
Box operator+(const Box& b)
{
this->length = this->length + b.length;
this->width = this->width + b.width;
this->height = this->height + b.height;
return *this;
}
我无法理解:
this-&gt; length = this-&gt; length + b.length;
- 醇>
return * this;
this.length在这里不起作用。
我为什么要return *this
?这里return this
还不够吗?
答案 0 :(得分:2)
1)&#34;这&#34;是一个指针 2)&#34;这&#34; pointer是一个常量指针,用于保存当前对象的内存地址
会员签名: Box运算符+(const Box&amp; b)
&#34;我为什么要归还这个?回报这还不够吗?&#34;
如果您返回&#34;此&#34;,那么您将返回一个指针Box *,并且您的成员签名与此不一致。
因此,您需要按值返回,因此,取消引用并返回。
答案 1 :(得分:1)
(撇开operator+()
更改this
的值的事实),您返回*this
的原因是允许这样的表达式:
Box a, b, c;
// ... init the Boxes
Box d = a + b + c;
在这种情况下,a+b
的结果需要&#34;馈送&#34;进入operator+
以将c
的值添加到其中。这是通过创建一个表示a+b
结果的新临时对象来完成的(在您的情况下 - 这是*this
中返回的operator+
)。
现在您应该看到,如果您要返回指针this
,则无法优雅地记下a+b+c
,因为a+b
将不再是一个引用,为了正确地调用它上面的operator+
,你会写一些丑陋的东西:
(a+b).operator+(c)
上述表达式中的赋值operator=
也有相同的推理 - 你真的想要返回对象的引用,而不是指向它的指针。
答案 2 :(得分:0)
每当您返回引用或副本时,都希望返回*this
,而只有在返回指向类对象的指针时才会返回this
。
答案 3 :(得分:0)
“ this ”是指向Box类型对象的指针。 您的返回类型是Box类型的具体对象。
当你返回* this时,你将取消引用指针并返回对象(Box&amp;)的引用,然后编译器使用复制构造函数Box(const Box&amp;)转换为新对象。
事实上,如果您写了b3 = b1 + b2,您会注意到修改b3不会进一步修改b1。 这与你的问题有关。
但是,作为旁注,您在定义运营商的方式上会产生一些混乱。通常,当您重载算术运算符时,您可以重载operator +和operator + =
operator +返回给定类型的新具体对象,不应该修改操作数。它的典型签名是:
Box Box::operator+(const Box& R) const
因此,实现它的典型方法是复制两个操作数之一,然后执行求和并返回此新对象。请注意,该函数声明为常量
如果要按照自己想要的方式修改第一个操作数,可以使用+ =运算符。 此运算符具有不同的签名,它假定您修改操作数,在这种情况下,它实际上返回一个引用,该引用应该是对左操作数的引用。所以在这种情况下你会有
Box& Box::operator+=(const Box& R)
在这种情况下,您可以看到该函数不是常量,因为您假设您要修改操作数,在这种情况下,您应该返回* this,这是对刚修改的对象的引用。