C++编程:运算符重载中的引用如何工作?
C++ Programming: How do references work in operator overloading?
我试图理解为什么在重载C++运算符时使用引用。例如,在以下代码段中:
GenericObject& operator=(const GenericObject &rhs)
{
if (&rhs == this)
return *this;
objectAttribute = GenericObject.objectAttribute;
return *this;
}
我有三个问题:
- 为什么该函数返回引用?
- 为什么该函数接受引用?是否为了避免复制对象内容的开销(如果 GenericObject 对象是参数而不是对 GenericObject 的引用,这将是必需的(?
- 为什么在将右侧与此进行比较时,在第三行中使用参考?
尽我所能,您的问题的答案是:
-
返回引用,因为它稍后会在构造函数/析构函数调用中保存您。我的一位教授使用的一个很好的经验法则是"如果有疑问,请像整数一样做。当你查看像
int x = 1, y = 2, z = 3; x = y = z;
这样的操作时,通过引用返回允许你获取z
的值,将其分配给y
,然后获取(新(y
的值并将其分配给x
。按值返回要求您创建z
的副本,使用它来分配y
,删除z
的副本,然后在删除此副本之前创建(新的(y
的副本以分配x
。对于ints来说可能不是什么大问题,但这可能意味着一个具有更大数据的更长的程序。 -
你是完全正确的!出于同样的原因,我们试图在第一部分节省时间和精力,我们通过引用传递右侧项目,以避免必须进行复制(这需要构造函数/析构函数调用(并使其
const
,这样我们就不会无意中更改它,因为这对operator=
来说是不合逻辑的。作为旁注,如果您在某些情况下不小心,额外的构造函数/析构函数调用可能会很危险(有关此示例,请参阅深层副本与浅副本(。 -
当你像
x = y;
这样拨打电话时,它在逻辑上等同于x.operator=(y);
。因为 x 是某个对象,我们需要一种方法来引用整个事物,而关键字this
允许此功能。 但是,this
是一个指针,因此由于我们尝试比较指针和对象,因此我们需要指向rhs
持有的对象(或在我的示例中为y
(,并且我们使用&
获取此地址。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?