C++ c+中的操作符覆盖+;=操作人员
下面是运算符=重载的节点类(仅显示自赋值位) 我的问题是为什么我需要显式地键入“&other”,而“other”是否已经是对节点对象的引用?此外,当我取消引用“this”并进行比较时,如中所示: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
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
}
}