zoukankan      html  css  js  c++  java
  • 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;
        }

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

  • 相关阅读:
    Mac普通用户修改了/etc/sudoers文件的解决办法
    python对缓存(memcached,redis)的操作
    线程、进程、协程和队列
    python作用域和多继承
    sokect编程进阶
    socket编程基础
    python面相对象进阶
    python异常处理
    configparser模块
    subprocess模块
  • 原文地址:https://www.cnblogs.com/lailailai/p/4176921.html
Copyright © 2011-2022 走看看