c++ 中的运算符覆盖 = 运算符
Operator overlaoding in c++ = operator
下面是一个带有运算符=重载的节点类(仅显示自赋值位(。
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
节点相同,您要比较两个节点在内存中是否具有相同的地址。如果已实现,则对节点的引用的比较将仅在两个节点具有相同值时才进行比较。
使用引用的第二种方法的错误可能是未为节点类定义比较运算符。
- 为什么同时覆盖全局新运算符和特定于类的运算符不是模棱两可的行为?
- 为什么无法覆盖涉及第三方代码的模板类的运算符<<?
- 用std::string覆盖[]运算符
- 我想覆盖运算符'='但是在重载之后,运算符没有将正确的信息传递给对象
- c++ 中的运算符覆盖 = 运算符
- 如何在二叉树类中正确覆盖运算符<<?
- 使用运算符覆盖排序没有得到我想要的
- <<运算符覆盖使用 g++ 而不是窗口编译
- C++运算符删除覆盖并不总是使用
- Openfoam C++ 运算符和覆盖
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- 无法覆盖C++中纯抽象类中的运算符删除/新建
- 对运算符删除覆盖的工作方式感到困惑
- 运算符 = 覆盖 c++
- 运算符覆盖 - 何时使用好友
- C++运算符覆盖 - 为什么首选朋友
- 初始化对象后,如何使用赋值运算符覆盖C++中的类对象
- Realloc 和全球本地新建/删除运算符覆盖
- unordered_multimap用法和运算符覆盖
- 特定预期模式的提取运算符覆盖