zoukankan      html  css  js  c++  java
  • Effective C++ 条款11

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

    什么是自我赋值,非常明显。

    就是自己的值赋值给了自己。以下的代码就是自我赋值:

    class Widget
    {
    public:
        Widget& operator=(const Widget& rhs)
        {
            delete p;
            p=new int(ths.p);
            return *this;
        }
        int *p;
    };
    
    Widget w1,w2;
    w1=w2;
    w1=w1;//自我赋值。

    如上代码,自我赋值的时候会出现删除自身数据的操作,这样非常危急。由于p变成了野指针。

    为了防止以上错误能够进行“自我測试”,假设发现是自我赋值就直接返回。


    例如以下代码:

    class Widget
    {
    public:
        Widget& operator=(const Widget& rhs)
        {
            if(this==&rhs)//自我測试
                return *this;
            delete p;
            p=new int(rhs.p);
            return *this;
        }
        int *p;
    };

    可是。以上代码有还有一个缺陷,就是一旦new一个新空间失败,p还是会变成野指针。
    所以,能够先保存原来的数据,等new成功之后在进行数据替换;
    再次改动代码例如以下:

    class Widget
    {
    public:
        Widget& operator=(const Widget& rhs)
        {
            int tmp=p;//记录原先内存
            p=new int(rhs.p);
            delete tmp;//释放原先内存
            return *this;
        }
        int *p;
    };
  • 相关阅读:
    C#类型转换
    C#面向对象之多态
    C#面向对象之继承
    C#各种字段类型对比
    C#关键字:static
    C#面向对象之封装
    C#关键字:访问修饰符
    C#类型成员:构造函数
    C#类型成员:方法
    C#类类型
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5204630.html
Copyright © 2011-2022 走看看