美文网首页架构算法设计模式和编程理论程序员
拷贝赋值中对自我赋值的检查(GeekBand第二周)

拷贝赋值中对自我赋值的检查(GeekBand第二周)

作者: wtcamel | 来源:发表于2017-01-13 13:02 被阅读0次

    课程里,在实现string类的copy op=时,提到一个很重要的处理,检测自我赋值(self assignment)。

    自我赋值检查,一来提高效率,二来避免自我赋值时出现内存错误,具体情况课程时老师都有讲到,不做赘述。这里想讨论的,是检测自我赋值的方法。
           课程学习中,看到上图红框中的检测方式,当时有一个疑问,为什么可以直接比较这两个对象呢?难道不需要进行“==”的重载吗?听完课程,到作业部分时候,同样需要实现一个copy
    op=。依葫芦画瓢,做了自我赋值的检测,验证代码写好,程序运行,没有报错,结果正确,果然不需要重载就可以了!

           到了这一步,疑惑更大了,为什么会这样?想不出所以然,直接跟代码。

    果然一致!有点懵比了,第一周课程里的operator==,难道是没有必要的吗?没道理啊?!

    再仔细比对,终于发现问题了。这里的==,比较的不是两个对象,是两个指针,也就是两个地址!两个对象的地址一致,当然可以说两个对象其实是同一个了。

    再进一步思考,如果这里真的使用重载后的==,进行两个对象的比较,即使两个对象相等,如果地址不同,也不能说是同一个对象,所以,这种判断方式反而是无效的。

    那么,还有没有什么方法可以进行判断呢?如果对每个对象都能有个唯一的ID进行标记,然后对比对象的这个唯一ID?好像没问题。废话不多说,代码简单的改造一下,也不去创建GUID了,直接利用Sharp基类中的_no,外部传入不同的值作为唯一ID使用,改造后代码如下:

    再看运行结果:

    事实证明,这种方式也是可行的,当然,相比之前的地址比较的方式,有点画蛇添足。

    但如果是在不支持内存地址访问的语言中,比如c#/Java之类的,应该就能派上用场了。



    本人其它学习笔记:

    编写大气的代码--第一周学习体会

    相关文章

      网友评论

        本文标题:拷贝赋值中对自我赋值的检查(GeekBand第二周)

        本文链接:https://www.haomeiwen.com/subject/puqsbttx.html