Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的操作符覆盖+;=操作人员_C++_Reference_Operator Overloading - Fatal编程技术网

C++ c+中的操作符覆盖+;=操作人员

C++ c+中的操作符覆盖+;=操作人员,c++,reference,operator-overloading,C++,Reference,Operator Overloading,下面是运算符=重载的节点类(仅显示自赋值位) 我的问题是为什么我需要显式地键入“&other”,而“other”是否已经是对节点对象的引用?此外,当我取消引用“this”并进行比较时,如中所示: if ( *this!= other ) 它仍然会给出一个错误。是否因为这是指向节点对象的常量指针,而“其他”是 常量节点对象?因为即使是这样的事情也行不通: Node& operator=(const Node &other) { if ( (const Node)*thi

下面是运算符=重载的节点类(仅显示自赋值位)

我的问题是为什么我需要显式地键入“&other”,而“other”是否已经是对节点对象的引用?此外,当我取消引用“this”并进行比较时,如中所示:

if ( *this!= other ) 
它仍然会给出一个错误。是否因为这是指向节点对象的常量指针,而“其他”是 常量节点对象?因为即使是这样的事情也行不通:

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

首先,检查另一个节点是否与
相同只有在
执行任务
部分需要大量工作和/或在同一节点(即
节点=节点
)上使用
操作符=
的概率较高时,才需要此
节点

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

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

“其他”不是已经是对节点对象的引用了吗

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

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

是否因为这是指向节点对象的常量指针,而“其他”是常量节点对象

不,这是因为
*此
获得对象的别名,而
其他
已获得别名。当你写这篇文章时您正在尝试应用的其他
=到对象本身,而不是对象的地址。因为可能没有
操作符=已定义,无法进行比较。我也不怀疑你想这么做

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


(const Node)*此
正在解除对该
的引用,从而获取不是指针(而是对象)的内容,然后尝试将该对象强制转换为指针类型。这不是语言隐含支持的东西。因此出现了错误。

在测试中使用操作员的地址
,即取其他
的地址,并将其与该
包含的地址进行比较。测试正在确定
其他
是否引用同一对象。IOW,代码正在检查自分配,即将对象分配给自身,例如
节点n;n=n
但是当你取消引用一个指针时,说“现在你有了对象本身”或者“现在你有了对象的别名”是正确的吗?我听过无数次“对象别名”,那么实际对象在哪里呢?它不是存储在指针或引用所指向的地址中吗?哦,我想我明白了。所以‘other’是节点对象本身,但是&other是该节点对象(或引用)的地址?@Shinji san-“现在你有了对象本身”这不是一个坏的看待它的方式,所以你可以说是的。实际对象在内存中的某个地方。如果它是一个变量(名称本身可以被认为是另一个“原始”别名),则可以为它命名,或者在动态分配的情况下没有名称。是的,它位于指针包含的地址,但地址不是对象。就像一个牌子上写着“湖”不是湖本身,只是告诉你在哪里可以找到它。@Shinji san-是的,你找到了
&其他
是引用为其提供别名的对象的地址。
Node& operator=(const Node &other) {
    if ( (const Node)*this != other) {
            // do stuff
    }
}