左边的对象
}
string& string::operator=(const string& rhs)
{
...
return rhs; // 返回右边的对象
}
对你来说,这好象是拿六个一和十二的一半来比较一样为难。实际上他们有很大的不同。
首先,返回rhs的那个版本不会通过编译,因为rhs是一个const string的引用,而operator=要返回的是一个string的引用。当要返回一个非const的引用而对象自身是const时,编译器会给你带来无尽的痛苦。看起来这个问题很容易解决——只用象这样重新声明operator=:
string& string::operator=(string& rhs) { ... }
这次又轮到用到它的应用程序不能通过编译了!再看看最初那个连续赋值语句的后面部分:
x = "hello"; // 和x.op=("hello");相同
因为赋值语句的右边参数不是正确的类型——它是一个字符数组,不是一个string——编译器就要产生一个临时的string对象(通过stirng构造函数——参见条款m19)使得函数继续运行。就是说,编译器必须产生大致象下面这样的代码:
const string temp("hello"); // 产生临时string
x = temp; // 临时string传给operator=
编译器一般会产生这样的临时值(除非显