第13章 复制控制(3)
13.2 赋值操作符
与复制构造函数一样,如果类没有定义自己的赋值操作符,则编译器会合成一个。
1. 介绍重载赋值
重载操作符是一些函数,其名字为operator后跟着所定义的操作符的符号。因此,通过定义名为operator=的函数,我们可以对赋值进行定义。
大多数操作符可以定义为成员函数或非成员函数。当操作符为成员函数时,它的第一个操作数隐式绑定到this指针。有些操作符(包括赋值操作符)必须是定义自己的类的成员。因为赋值必须是类的成员,所以this绑定到指向左操作数的指针。因此,赋值操作符接受单个形参,且形参是同一类类型的对象。右操作数一般作为const引用传递。
赋值操作符的返回类型应该与内置类型赋值运算返回的类型相同。内置类型的赋值运算返回对右操作数的引用,因此,赋值操作符也返回对同一类类型的引用。
class Class6
{
Class6 &operator=(const Class6 &c6);
};
2. 合成赋值操作符
合成赋值操作符(synthesized assignment operator)与合成复制构造函数的操作类似。它会执行逐个成员赋值(memberwise assignment):右操作数对象的每个成员赋值给左操作数对象的对应成员。除数组之外,每个成员用所属类型的常规方式进行赋值。对于数组,给每个数组元素赋值。
合成赋值操作符根据成员类型使用适合的内置或类定义的赋值操作符,依次给每个成员赋值,该操作符返回*this,它是对左操作数对象的引用。
3. 复制和赋值常一起使用
类也可以定义自己的赋值操作符。一般而言,如果类需要复制构造函数,它也会需要赋值操作符。
实际上,应该将这两个操作符看作一个单元。如果需要其中一个,我们几乎也可以肯定需要另一个。
摘自 xufei96的专栏
补充:软件开发 , C++ ,