Effective_C++:17、在operator=中检查是否“自己赋值给自己”

17、在operator=中检查是否“自己赋值给自己”

1、为何检查是否“自己赋值给自己”

在使用赋值操作符时,我们只要求调用的对象类型、参数类型正确即可。所以,自己赋值给自己是完全合法的,如可能将一个对象的别名作为另一个对象赋值给这个对象。发生自己赋值给自己,可能会发生一些问题,为此,我们需要检查是否“自己赋值给自己”。

1.为了确保正确性。使用赋值操作符给左边的对象配置新资源时,可能需要先释放他原来配置的资源,此时若发生自己给自己赋值,则会失败,因为他同时也将要配置的新资源释放掉了。如String对象的赋值操作符,就会先delete左边对象的旧有内存,然后再用new配置新内存,若发生自己给自己赋值,则delete之后,同时也将赋值对象的内存delete,无法再使用new来配置新内存。

2.为了效率。在进行赋值时,若是自己给自己赋值,那直接返回即可,而无需进行后续的一些不必要的动作。

2、如何检查是否“自己赋值给自己”

检查是否“自己赋值给自己”,就是检查这两个对象是否相同,即object identity。而对于两个对象是否相同的定义通常为以下两种。

1.检查他们是否有相同的值。

2.检查他们的内存地址是否相同。

而对于要求更精确的时候,可能需要通过一个成员函数返回一个对象识别码来检查两个对象是否相同。

实际上,在出现指针和引用的时候,任何两个代表兼容型别的对象名称,都有可能实际上指向同一个对象。因此,在写函数写代码时,必须考虑这种情况的可能性。

 

猜你喜欢

转载自blog.csdn.net/l1dian11/article/details/81075170
今日推荐