• Effective C++ .10,11 operator=的约定与注意


    1. 返回一个reference to *this

    返回一个指向自身的引用符合惯例,可以进行如(a=c).modify()类似的操作,即可以形成链式操作,否则修改的只是一个临时对象。这个和Java中常用的builder模式是一个道理

    2. 自我赋值的检测和异常安全

    赋值进行前进行自我检测,相同就直接返回。如果不进行检测,很容易造成资源的错误释放,导致无法复制(自己的资源被释放了)。

    class Data {
    private:
        int* data;
        int len;
    public:
        Data(int cnt) {
            if (cnt < 0) {
                cnt = 0;
            }
            data = new int[cnt];
            len = cnt;
        }
        
        Data& operator=(const Data& rhs) {
            if (&rhs == this) {
                return *this;
            }
            
            delete data;
            data = new int[rhs.len];
            for (int i=rhs.len; i>=0; i--) {
                data[i] = rhs.data[i];
            }
            return *this;
        }
        
        void set(int idx, int value) {
            if (idx >= len || idx < 0) {
                return;
            }
            data[idx] = value;
        }
        int get(int idx) {
            if (idx >= len || idx <0) {
                return 0;
            }
            return data[idx];
        }
    };

    当然也可以照书上的写法把这个改成更好的形式:

        Data& operator=(const Data& rhs) {
            int* olddata = data;
            int* newdata = new int[rhs.len];
            for (int i=rhs.len; i>=0; i--) {
                newdata[i] = rhs.data[i];
            }
            data = newdata;
            delete olddata;
            return *this;
        }

    即确保新资源拿到后复制完成后再进行老的资源释放

  • 相关阅读:
    c++ 常用程序整理
    C++ 语言特点
    作业-列表,字典操作实例
    作业练习P194,jieba应用,读取,分词,存储,生成词云,排序,保存
    Python for循环生成列表
    str.format() 格式化数字的多种方法
    python3排序 sorted(key=lambda)
    第四周作业
    第三周作业
    第三周作业——列表,元组,字典
  • 原文地址:https://www.cnblogs.com/lailailai/p/4176921.html
Copyright © 2020-2023  润新知