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;
    }

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

时间: 2024-10-28 06:50:26

Effective C++ .10,11 operator=的约定与注意的相关文章

effective c++ Item 11 在operator=中处理自我赋值

1.自我赋值是如何发生的 当一个对象委派给自己的时候,自我赋值就会发生: 1 class Widget { ... };2 3 Widget w;4 5 ...6 7 w = w; // assignment to self. 这看上去是愚蠢的,但这是合法的,所以请放心,客户端是可以这么做的.此外,自身赋值也并不总是很容易的能够被辨别出来.举个例子: 1 a[i] = a[j]; // potential assignment to self 上面的代码在i和j相等的情况下就是自我赋值,同样的,

读书笔记 effective c++ Item 11 在operator=中处理自我赋值

1.自我赋值是如何发生的 当一个对象委派给自己的时候,自我赋值就会发生: 1 class Widget { ... }; 2 3 Widget w; 4 5 ... 6 7 w = w; // assignment to self. 这看上去是愚蠢的,但这是合法的,所以请放心,客户端是可以这么做的.此外,自身赋值也并不总是很容易的能够被辨别出来.举个例子: 1 a[i] = a[j]; // potential assignment to self 上面的代码在i和j相等的情况下就是自我赋值,同

Effective C++ 条款11,12 在operator= 中处理&ldquo;自我赋值&rdquo; || 复制对象时不要忘记每一个成分

1.潜在的自我赋值     a[i] = a[j];     *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象,当其中一个对象被删,另一个也被删,这会造成不想要的结果. 该怎么办? 比如:   widget& widget:: operator+ (const widget& rhs) {    delete pd;    pd = new bitmap(*rhs.pb);    return *thi

Effective C++ Item 10 令operator= 返回一个reference to *this

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:令赋值(assignment)操作符返回一个reference to *this --> 这样可以实现级联赋值 示例: #include <iostream> #include <string> using namespace std; class Widget{ public: Widget(int v):value(v){} Widget& opera

Effective C++ Item 11 在operator= 中处理“自我赋值”

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:确保当对象自我赋值时operator=有良好行为.其中技术包括比较"来源对象"和"目标对象"的地址.精心周到的语句顺序.以及copy-and-swap. 示例:没有"证同测试" #include <iostream> #include <string> using namespace std; class Bi

App Store审核指南中文版(2014.10.11更新)

目录   1.条款与条件  2.功能  3.元数据 4.位置  5.推送通知  6.游戏中心  7.广告  8.商标与商品外观  9.媒体内容  10.用户界面  11.购买与货币  12.抓取与聚合  13.设备损害  14.人身攻击  15.暴力  16.令人反感的内容 17.隐私  18.色情  19.宗教.文化与种族  20.竞赛.赌博.彩票和抽奖 21.慈善与援助  22.法律要件  23.Passbook 24.儿童类别 25.扩展 26.HomeKit 27.HealthKit 2

解决mac 10.11 以后 无法使用未签名第三驱动

解决 最新版 mac 系统 无法使用未签名第三驱动 10.12.多 我的情况是 10.11.4 Beta (15E27e) 使用绿联usb网卡不正常. 下面的命令为检测驱动是否装载的一些命令.sudo kextload /Library/Extensions/AX88772.kext 报错: failed to load - (libkern/kext) not found; check the system/kernel logs for errors or try kextutil(8).

更新到10.11后 cocoapods 重装问题

更新到10.11后 cocoapods 需要重新安装,但是使用原来的淘宝源(http://ruby.taobao.org/) 会报错 ERROR:  Could not find a valid gem 'cocospods’ (>= 0), here is why: Unable to download data from http://ruby.taobao.org/ - bad response Not Found 404 (http://ruby.taobao.org/latest_sp

Windows下虚拟机安装Mac OS X &mdash;&ndash; VM12安装Mac OS X 10.11

______________________________________________________________________________________________________________________________________________________________________________________________________________________ 注:本文来源:csdn:N的专栏.<Windows下虚拟机安装Mac