在运算符重载中返回此或* this?

时间:2015-09-27 16:38:12

标签: c++ oop operator-overloading

我试图在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;
        } 

我无法理解:

  
      
  1. this-&gt; length = this-&gt; length + b.length;

  2.   
  3. return * this;

  4.   

this.length在这里不起作用。 我为什么要return *this?这里return this还不够吗?

4 个答案:

答案 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,这是对刚修改的对象的引用。

Quick guide on operator overloading