赋值操作符
内置类型可以直接赋值,类也应该定义对该类型对象赋值会发生什么。和拷贝构造函数一样,如果类没有定义自己的赋值操作符,编译器就会为类合成一个。
CBox box1,box2;
box1 = box2;
赋值操作符重载
重载操作符是一些函数,其名字为operator后跟着所定义的操作符的符号。因此可以通过定义名为operator=的函数来对赋值行为进行定义。和其他函数一样,操作符函数有一个返回值和形参表。形参表有与该操作符的操作数数目相同的形参。如果操作符函数是一个类的成员,则隐含包括一个this形参。赋值是二元运算,所以该操作符函数有两个形参:第一个形参是左操作数,第二个形参是右操作数。因为赋值必须是类的成员,所以this指针绑定到指向左操作数的指针。因此,赋值操作符接受单个形参,且该形参是同一类类型的对象。右操作数一般作为const引用传递。
赋值操作符的返回类型应该与内置类型赋值运算返回的类型相同。内置类型的赋值运算返回对右操作数的引用,因此,赋值操作符也返回对同一类类型的引用。
CBox的赋值操作可以声明为:
CBox& operator=(const CBox &)
合成赋值操作符
合成赋值操作符与合成拷贝构造函数的操作类似。它会进行逐个成员赋值。将右操作数对象的每个成员依次简单的赋值给左操作数对象对应的成员。数组成员的每个数组元素都会进行赋值。
例如,CBox的合成赋值操作符可能如下:
CBox& CBox::operator=(const CBox&rhs) { m_Length = rhs.m_Length; m_Width = rhs.m_Width; m_Height = rhs.m_Height; return *this; }
拷贝和赋值常一起使用
可以使用合成拷贝构造函数的类通常也可以使用合成赋值构造操作符。一般,如果类需要定义自己的拷贝构造函数,它也需要定义自己的赋值操作符。
三法则(什么时候该自己定义赋值操作符)
拷贝构造函数、赋值操作符、析构函数,往往一起需要,需要其中一个成员往往就需要其他两个。
建议:按照“三法则”来。