分配运算符
赋值运算符是最重要的运算符之一,因为它允许你更改变量的状态。
如果没有为 class
/ struct
重载分配运算符,它将由编译器自动生成:自动生成的赋值运算符执行成员赋值,即通过在所有成员上调用赋值运算符,以便复制一个对象另一方,一个成员。当简单的成员赋值不适合你的 class
/ struct
时,赋值运算符应该被重载,例如,如果你需要执行对象的深层复制。
重载赋值运算符 =
很简单,但你应该遵循一些简单的步骤。
- **测试自我分配。**此检查很重要,原因有两个:
- 自我分配是一种不必要的副本,因此执行它是没有意义的;
- 在自我分配的情况下,下一步将不起作用。
- **清理旧数据。**旧数据必须替换为新数据。现在,你可以理解上一步的第二个原因:如果对象的内容被破坏,则自我分配将无法执行复制。
- **复制所有成员。**如果你为
class
或struct
重载了分配运算符,它不会由编译器自动生成,因此你需要负责从其他对象复制所有成员。 - 返回
*this
。运算符通过引用自行返回,因为它允许链接(即int b = (a = 6) + 4; //b == 10
)。
//T is some type
T& operator=(const T& other)
{
//Do something (like copying values)
return *this;
}
注意: other
由 const&
传递,因为被分配的对象不应该被更改,并且通过引用传递比按值更快,并且为了确保 operator=
不会意外地修改它,它是 const
。
赋值运算符只能在 class
/ struct
中重载,因为 =
的左值始终是 class
/ struct
本身。将其定义为自由函数没有这种保证,因此不允许这样做。
当你在 class
/ struct
中声明它时,左边的值隐含了 class
/ struct
本身,所以没有问题。