c++ 中的运算符覆盖 = 运算符



下面是一个带有运算符=重载的节点类(仅显示自赋值位(。

Node& operator=(const Node &other) {
if ( this != &other) {
// do stuff
}
}

我的问题是为什么我需要显式键入"&other","other"不是已经是对 Node 对象的引用吗?另外,当我取消引用"这个"并进行比较时:

if ( *this!= other ) 

它仍然会给出错误。是因为这是指向 Node 对象的常量指针,但"其他"是 一个常量节点对象?因为即使是这样的事情也行不通:

Node& operator=(const Node &other) {
if ( (const Node)*this != other) {
// do stuff
}
}
">

other"不是已经是对 Node 对象的引用吗?

是的。引用不是指针。它是对象的直接别名。当你与它交互时,你直接与对象交互,而不是与它的地址交互。另一方面,指向对象的指针是地址的容器。当您与指针交互时,您不会影响它指向的对象,只会影响地址。相反,您可以取消引用它以获取对象的别名,这就是您影响 pointee 的方式。

因此,由于它们的差异,您通常无法比较指针和引用。因此,要检查对象标识,您需要从引用中获取地址,然后将其与this指针进行比较。

是因为这是指向 Node 对象的常量指针,但"其他"是常量节点对象吗?

不,这是因为*this获得了对象的别名,而other已经是。当您编写*this != other时,您尝试将!=应用于对象本身,而不是它们的地址。由于可能没有定义operator!=,因此无法进行比较。我也不怀疑你想这样做。

因为即使是这样的事情也行不通

(const Node)*this取消引用this,从而获得不是指针(而是对象(的东西,然后尝试将对象强制转换为指针类型。这不是语言隐含支持的东西。因此错误。

首先,仅当do stuff部分需要大量工作和/或在同一节点上使用operator=的可能性相当高时,才需要检查另一个节点是否与this节点相同(即node = node(。

因此,为了检查,如果另一个节点与this节点相同,您要比较两个节点在内存中是否具有相同的地址。如果已实现,则对节点的引用的比较将仅在两个节点具有相同值时才进行比较。

使用引用的第二种方法的错误可能是未为节点类定义比较运算符。

最新更新