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

条款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 函数共同调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值