C++编程:运算符重载中的引用如何工作?

C++ Programming: How do references work in operator overloading?

本文关键字:何工作 工作 引用 编程 运算符 重载 C++      更新时间:2023-10-16

我试图理解为什么在重载C++运算符时使用引用。例如,在以下代码段中:

GenericObject& operator=(const GenericObject &rhs)
{
if (&rhs == this)
return *this;
objectAttribute = GenericObject.objectAttribute;
return *this;
}

我有三个问题:

  1. 为什么该函数返回引用?
  2. 为什么该函数接受引用?是否为了避免复制对象内容的开销(如果 GenericObject 对象是参数而不是对 GenericObject 的引用,这将是必需的(?
  3. 为什么在将右侧与此进行比较时,在第三行中使用参考?

尽我所能,您的问题的答案是:

  1. 返回引用,因为它稍后会在构造函数/析构函数调用中保存您。我的一位教授使用的一个很好的经验法则是"如果有疑问,请像整数一样做。当你查看像int x = 1, y = 2, z = 3; x = y = z;这样的操作时,通过引用返回允许你获取z的值,将其分配给y,然后获取(新(y的值并将其分配给x。按值返回要求您创建z的副本,使用它来分配y,删除z的副本,然后在删除此副本之前创建(新的(y的副本以分配x。对于ints来说可能不是什么大问题,但这可能意味着一个具有更大数据的更长的程序。

  2. 你是完全正确的!出于同样的原因,我们试图在第一部分节省时间和精力,我们通过引用传递右侧项目,以避免必须进行复制(这需要构造函数/析构函数调用(并使其const,这样我们就不会无意中更改它,因为这对operator=来说是不合逻辑的。作为旁注,如果您在某些情况下不小心,额外的构造函数/析构函数调用可能会很危险(有关此示例,请参阅深层副本与浅副本(。

  3. 当你像x = y;这样拨打电话时,它在逻辑上等同于x.operator=(y);。因为 x 是某个对象,我们需要一种方法来引用整个事物,而关键字this允许此功能。 但是,this是一个指针,因此由于我们尝试比较指针和对象,因此我们需要指向rhs持有的对象(或在我的示例中为y(,并且我们使用&获取此地址。