欢迎光临散文网 会员登陆 & 注册

Effective C++ 第十一条 Handle assignment to self in operator = .

2023-01-14 10:16 作者:九思519  | 我要投稿

在 operator= 中处理 “自我赋值 ”

        在编程的时候,赋值操作非常常见,但是有时候可能会出现自己的值赋给自己,当然这个也没有问题,但是在 C++ 的 operator= 中不同的程序员存在不同的代码习惯,其中一些就会造成错误。

这个时候你能一眼发现这里面的多余,但是代码还是正确的,只是看起来不太聪明。有的时候就不容易看出来了

当 i = j 的时候,很难事先想到,即使出了问题也很难被发现。

        下面列举几种情况并分析它是否正确以及如果错误会出现什么错误。

case 1

case 1 这种情况大多数时候不会出错,现在假设 rhs 和 *this 是同一个对象,那么 delete pd;会将本对象中的资源 pd 释放掉,然后的 new Bitmap 操作就会出错,因为 *rhs.pb 已经被释放掉了,无法被取值复制了。我们可以增加一个认证测试,当且仅当 rhs 不是和本对象相同的时候才赋值。

case 2

case 2 增加了一个 if 判断,可以解决这个问题,但是如果学过计算机组成原理中流水线的知识,就清楚的知道如果增加了一个 if 判断,流水线吞吐率会下降,如果 PC 预测错误造成的错误惩罚会很大。

case 3

case 3 提供了一种思路,先把 rhs 的内容复制一份为 temp ,temp 是为临时对象,temp 和 *this 交换内容之后,函数返回,又因为 temp 是临时对象,函数结束,temp 自动被释放。

case 4

case 4 思路和 case 3 一模一样,只是实现方式有所有不同。如果不清楚 by value 和 by reference 的区别请继续看,如果清楚就不需要再往后看了。

by value 和 by reference

现在有三个 OP 操作,直接传入一个对象叫做 by value,传引用和传指针都叫做 by reference。区别如下。假设我现在有一瓶可乐,叫做 a,如果我把这个可乐作为参数,通过传对象的方式传入,在函数内部,其实并不会对可乐 a 进行操作,而是复制一瓶一模一样的可乐 b,对可乐 b 进行操作。也就是说,我把 a 传进去,在函数内部我把可乐倒掉,其实倒掉的是 b,a还是完好无损,没有改变。如果是 by reference,那么我传入 a,那么在函数内部操作的对象就是 a,而不是复制出来的一模一样的 b。

输出结果是 3 1 1

Effective C++ 第十一条 Handle assignment to self in operator = .的评论 (共 条)

分享到微博请遵守国家法律