您的位置:首页 > 编程语言 > C语言/C++

【Effective C++读书笔记】篇五(条款10~条款12)

2016-07-03 16:21 260 查看
条款10:令 operator = 返回一个 reference to *this                                                        

例子如下:

<span style="font-size:14px;">#include <iostream>

using namespace std;

class base
{
public:
base(int tmp):a(tmp){}
base& operator=(const base& pb)
{
a = pb.a;
return *this; //此句可有可无,结果一样。gcc 4.8.4
}
int a;
};

int main()
{
base b1(1);
base b2(2);
base b3(3);
cout << b1.a << " " << b2.a << " " << b3.a << endl;
(b1 = b2) = b3;
cout << b1.a << " " << b2.a << " " << b3.a << endl;
b1 = b2 = b3;
cout << b1.a << " " << b2.a << " " << b3.a << endl;
return 0;
}</span>

执行结果:
<span style="font-size:14px;">1 2 3
3 2 3
3 3 3
</span>

发现如果返回值不是 const reference to *this 时,等号左值可以再次被赋值。
C++里,这是一个协议,所有内置类型和标准程序库提供的类型如 string,vector,complex等都共同遵守。

如:

<span style="font-size:14px;"> string a("aaa");
string b("bbb");
string c("ccc");
(a = b) = c;
cout << a << " " << b << " " << c << endl;</span>

结果是:
<span style="font-size:14px;">ccc bbb ccc</span>

请记住:令赋值(assignment)操作符返回一个 reference to *this。









条款11:令 operator = 中处理“自我赋值”  
                                                                     


“自我赋值”发生在对象被赋值给自己。

class Widget {...}
Widget w;
...
w = w; //赋值给自己

虽然看起来有点傻,但合法,而且别认定用户就不会这么干。而且有的自我赋值不总是一眼就可以被发现,如
a[i] = a[j]; //当 i = j 时,就是个自我赋值

实际上两个对象只要来自同一个继承体系,它们甚至不需声明为相同类型就能造成“别名”,因为一个 base class 的 reference 或 pointer 可以指向一个 derived class 对象。

请记住:

1、确保当对象自我赋值时 operator= 有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及 copy-and-swap。

2、确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为任然正确。









条款12:复制对象时勿忘其每一个成分
                                                                            


请记住:


1、copying
函数(包括 copy 构造函数与 copy 赋值函数)应该确保复制“对象内的所有成员变量”及“所有 base class 成分”。


2、不要尝试以某个
copying 函数实现另一个 copying 函数。应该将共同机能放进第三个函数中,并由两个 copying 函数共同调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: