从复制赋值重载中通过引用返回
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
的地址,它本身不是Myclass
。 operator=
返回了对房子的引用,因此您将其取消引用以转到 Myclass&
,以便您可以返回引用。它与“课内”或“课外”无关。唯一的区别是地址与参考。
你可以用指针和地址做的事情之一是得到一个偏移量。 (“主街 13931 号下的 3 号房子”)。基本语法是*(pointer+3)
。事实证明这难以置信很方便,所以 C 对此做了一个特殊的语法:pointer[3]
。它是对来自pointer
地址的第三个对象的引用。因此,this[0]
与 *this
相同。距离地址有 0 个对象。
【讨论】:
谢谢你的回答。它消除了很多困惑,但我只是编程新手,所以也许我在问愚蠢的问题,this[0] => 这意味着对象本身???我知道它会返回什么(我认为它返回对象的名称,并且因为 operator= 返回对对象的引用,所以它将返回该对象的地址)??还有这个语法 this[0] 就像你把对象当作数组一样???所以如果我写这个[1]它将访问什么??? 指针和数组have an interesting relationship。对于指针p
,p[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
一样。它们完全相同,它们都是对指向对象的引用。引用不是完全是地址,它只是对某处对象的引用。在许多情况下,编译器只是直接使用对象,无论它在哪里。以上是关于从复制赋值重载中通过引用返回的主要内容,如果未能解决你的问题,请参考以下文章