hjk41的日志

Avatar

Effective C++笔记15: 让 operator = 返回一个指向 *this 的引用

对一个类 C 来说,正确的 operator = 格式应该是这样的:

C & C::operator = (const C & rhs){
    ...
    return *this;
}

为什么不返回 void 呢?因为我们要用 a=b=c 这样的操作,而它会被解释成 a=(b=c),如果 b=c 返回的是 void ,那就会变成 a=void ,显然不对。

为什么不返回 const C & 呢?因为 C++ 默认返回的就不是 const 型的。这样就能进行 (a=b)=c 的操作,虽然这样看起来很奇怪,但是对 int,float 等类型,这样的操作是合法的,所以我们自己写的 operator = 也应该让这种操作是合法的。

为什么不返回 rhs 呢?因为 rhs 是 const 类型的,而我们返回的 C& 却不是。比如下面的例子:

String & String::operator = (const & rhs){
    ....
    return rhs;
}

int main(){
    String s;
    s="hello";
    ....
}


这段代码是编译不过去的。因为 "hello" 是 const char * 类型,这时编译器实际进行的操作是这样的:

const String temp("hello");
s=temp;


而 String::operator = 却试图返回一个指向 temp 的指针,如果这个指针能被正确返回的话,那么我们岂不是可以更改 temp 的内容了?这显然不是我们愿意看到的,因为我们更改 temp 的话,更改的不是 "hello" 这个常量本身,而是一样临时变量,而且我们不能直接操作这个变量的。这就很容易造成混乱,所以 C++ 是不允许返回指向 const 变量的引用的。
所以这时我们就只有一个选择了,那就是返回一个指向 *this 的引用。

所以 C++ 是不允许返回指向 const 变量的引用的。
?????????????????????????/

有这个规定吗?

评论已关闭