C++ 通过C+中的引用+;

C++ 通过C+中的引用+;,c++,C++,我有这段代码 Stack& Stack:: operator=(const Stack& stack){ if(this == &stack){ return *this } } 这里我定义了操作符=,但我不明白,如果我在this==&stack和notthis==stack中通过引用堆栈收到了为什么它应该是&以及为什么我们在return*this和notthis中返回,请提前感谢您的帮助,因为这是一个指针(即stack*类型),而不是引用(即,

我有这段代码

Stack& Stack:: operator=(const Stack& stack){
   if(this == &stack){
      return *this
   }
}

这里我定义了操作符
=
,但我不明白,如果我在
this==&stack
和not
this==stack
中通过引用堆栈收到了为什么它应该是
&
以及为什么我们在
return*this
和not
this
中返回
,请提前感谢您的帮助,因为
这是一个指针(即
stack*
类型),而不是引用(即,不属于
堆栈类型&


我们使用
if(this==&stack)
只是为了确保语句

 s = s;
可以正确处理(特别是当您需要删除旧对象中的某些内容时)。指针比较只有在两者都是同一对象时才有效。当然,我们也可以通过值进行比较

if (*this == stack)
  return *this;
else {
  ...
}

但是
=
操作可能非常慢。例如,如果堆栈有N个项目,
*此==stack
将需要N个步骤。由于分配本身只需要N个步骤,这将使工作量加倍,而没有任何代价。

堆栈
类型为
堆栈&
,而
类型为
堆栈*
。您是che如果
堆栈
的地址等于
,则检查

如果我通过引用堆栈接收,为什么它应该在这个==&堆栈中


因为
这个
是一个指针(或“地址”),而
堆栈
是一个引用(不是指针):所以你需要说
&stack
(意思是“堆栈的地址”),这样它的类型与
这个
的类型匹配

为什么我们回报这个而不是这个


因为
这个
是一个指针(不是一个引用),但是这个方法应该返回一个引用(不是指针),所以你需要遵从它才能将指针变成一个引用。

简短回答你的两个问题

  • 据我所知,您会问,如果我们将引用作为函数参数(而不是abject),为什么要使用&sign。因为对abject的引用不是它的地址。您应该使用运算符&()来获取对象的地址

  • 这是一个指针,但是您应该返回reference,这样您就可以返回*这


  • 事实上,这取决于你想做什么样的比较。如果你想看看它们是否是同一个对象,你可以做
    this==&stack
    ,但是如果你想检查它们是否有相等的值,不管它们是否是同一个对象,你可以做
    *this==stack
    。第一个问题是问我们为什么要使用&If-already获取一个引用作为参数。