从复制赋值重载中通过引用返回

Posted

技术标签:

【中文标题】从复制赋值重载中通过引用返回【英文标题】:return by reference from copy assignment overload 【发布时间】:2020-07-30 20:55:50 【问题描述】:

我想知道,在重载赋值运算符的情况下,我们为什么不只使用this 而没有*?如果我只使用this,它会给我一个编译器错误。为什么我们不将*arr[i] 或任何其他变量一起使用,例如第二个和第三个示例中的return x

Myclass &Myclass::operator=(const Myclass &rhs)

    if(this==&rhs)
        return *this;
 

double& setValues( int i ) 
    return vals[i];   // return a reference to the ith element


int& setValues(int x) 
    return x;   // return address/reference  of x

【问题讨论】:

因为this是一个指向当前对象的指针,所以如果你想要一个对象的引用,你必须取消引用它 *x 表示x[0] @M.M 虽然正确,但我认为这只会在这里造成更多混乱 请注意,示例 3 看起来像炸弹。它返回一个对x的引用,而x是一个局部变量。 @logan_92 这是一件很奇怪的事情,但this 很奇怪。如果我没记错的话,this 是指针的唯一原因是当 this 添加到语言中时引用不存在。 【参考方案1】:

@logan_92:引用和指针有点棘手:House& 是对某处房子的引用(“那边是 Bob 的房子”)。 House* 是建筑地址(“13931 Main Street”)。取消引用指针就像开车到建筑物。

同样:this 是一个指针。它是Myclass地址,它本身不是Myclassoperator= 返回了对房子的引用,因此您将其取消引用以转到 Myclass&,以便您可以返回引用。它与“课内”或“课外”无关。唯一的区别是地址与参考。

你可以用指针和地址做的事情之一是得到一个偏移量。 (“主街 13931 号下的 3 号房子”)。基本语法是*(pointer+3)。事实证明这难以置信很方便,所以 C 对此做了一个特殊的语法:pointer[3]。它是对来自pointer 地址的第三个对象的引用。因此,this[0]*this 相同。距离地址有 0 个对象。

【讨论】:

谢谢你的回答。它消除了很多困惑,但我只是编程新手,所以也许我在问愚蠢的问题,this[0] => 这意味着对象本身???我知道它会返回什么(我认为它返回对象的名称,并且因为 operator= 返回对对象的引用,所以它将返回该对象的地址)??还有这个语法 this[0] 就像你把对象当作数组一样???所以如果我写这个[1]它将访问什么??? 指针和数组have an interesting relationship。对于指针pp[N] 只是写*(p+N) 的pretty way。所以如果N为0,*(p+0)->*(p)->*p。所以this[0] 将是*this p[1]*p 之后存储的任何内容。如果你有一个数组,p[1] 是有意义的。如果没有,您已经在 the object 之外建立了索引(阅读链接,因为在 C++ 中,对象并不意味着您可能认为的那样)并亲身体验 Undefined Behaviour 的乐趣。这意味着this[1]this 之后的存储,坦率地说,即使this 是数组的一部分,我也从未深入研究过C++ 的各个角落是否合法。 有趣的旁注:因为p[N]*(p+N),你可以像N[p] 那样执行一些严重异常的smurf 并得到相同的结果。你可能永远找不到充分的理由来利用这个技巧,如果你这样做了,它可能会导致代码审查失败。但它确实出现在考试和面试的技巧问题中。 this 只是一个指针,就像任何其他指针一样(大部分)。所以C++语言不知道它是指向一个元素的指针还是指向多个元素的指针,所以它允许你写this[0],就像*this一样。它们完全相同,它们都是对指向对象的引用。引用不是完全是地址,它只是对某处对象的引用。在许多情况下,编译器只是直接使用对象,无论它在哪里。

以上是关于从复制赋值重载中通过引用返回的主要内容,如果未能解决你的问题,请参考以下文章

赋值运算符重载:返回 void 与返回引用参数

c++中重载输出操作符,为啥要返回引用

c++重载赋值操作符的返回值是啥?

为啥我们在赋值运算符重载中使用引用返回而不是在加减运算中?

赋值运算符重载函数 引用返回 与 对象返回

引用模板类型的赋值运算符需要非常量重载