分配运算符

赋值运算符是最重要的运算符之一,因为它允许你更改变量的状态。

如果没有为 class / struct 重载分配运算符,它将由编译器自动生成:自动生成的赋值运算符执行成员赋值,即通过在所有成员上调用赋值运算符,以便复制一个对象另一方,一个成员。当简单的成员赋值不适合你的 class / struct 时,赋值运算符应该被重载,例如,如果你需要执行对象的深层复制

重载赋值运算符 = 很简单,但你应该遵循一些简单的步骤。

  1. **测试自我分配。**此检查很重要,原因有两个:
    • 自我分配是一种不必要的副本,因此执行它是没有意义的;
    • 在自我分配的情况下,下一步将不起作用。
  2. **清理旧数据。**旧数据必须替换为新数据。现在,你可以理解上一步的第二个原因:如果对象的内容被破坏,则自我分配将无法执行复制。
  3. **复制所有成员。**如果你为 classstruct 重载了分配运算符,它不会由编译器自动生成,因此你需要负责从其他对象复制所有成员。
  4. 返回 *this。运算符通过引用自行返回,因为它允许链接(即 int b = (a = 6) + 4; //b == 10)。
//T is some type
T& operator=(const T& other)
{
    //Do something (like copying values)
    return *this;
}

注意: otherconst& 传递,因为被分配的对象不应该被更改,并且通过引用传递比按值更快,并且为了确保 operator= 不会意外地修改它,它是 const

赋值运算符只能class / struct 中重载,因为 = 的左值始终class / struct 本身。将其定义为自由函数没有这种保证,因此不允许这样做。

当你在 class / struct 中声明它时,左边的值隐含了 class / struct 本身,所以没有问题。