l 缺省版本的operator=函数具有如下形式:
C&C::operator=(const C&);
l 返回值常犯的错误:返回void,妨碍了连续赋值操作;返回const对象的引用,使该语句不能通过(w1 = w2)= w3。
l 即使重载了赋值操作符,返回的也是类的对象的引用。如标准string类型提供了两个不同版本的赋值运算符,如下所示:
string&operator=(const string& rhs);
string&operator=(const char *rhs);
l string& operator=(conststring& rhs);
但当声明为如下形式:
string&string::operator=(string& rhs);
调用它的应用程序不能通过编译。如下所示:
string x;
x = “hello”;
因为赋值语句的右边参数不是正确的类型-它是一个字符数组,不是一个string-编译器就要产生一个临时的string对象(通过string构造函数,条款19)使得函数继续运行。 也就是,编译器必须产生大致像下面这样的代码:
const string temp(“hello”);
x = temp;
编译器一般会产生这样的临时值(除非显示地定义了所需要的构造函数),但该临时值是一个const。它可以防止传递到函数内的临时值被修改。否则,程序员就会很奇怪 的发现,只有编译器产生的临时值可以修改而他们在函数调用时实际传进去的参数却不行。
l 当定义自己的赋值运算符时,必须返回赋值运算符左边参数的引用,*this。如果不这样做,就会导致不能连续赋值,或导致调用时的隐式类型转换不能进行,或两种情况同时发生。