zoukankan      html  css  js  c++  java
  • 条款十一 在operator = 中处理"自我赋值"

    1.在operator = 中,有可能自己给自己赋值
    a[i] = a[j] //潜在自我赋值, 当i = j时
    *py = *px //潜在自我赋值 当py和px指向同一个地址时

    2.自我赋值的不安全性
    class Test{...};
    class ManTest
    {
    ManTest& operator = (const ManTest& rhs)
    {
    delete p;
    p = new Test(*rhs.p);
    return *this;
    }
    private:
    Test *p;
    };

    安全问题:当*this和rhs是同一个对象时,delete释放p的内存空间,然后new一块内存指向不存在的空间
    所以就出问题
    可以改一下operator = 函数
    ManTest& operator = (const ManTest& rhs)
    {
    if(this == &rhs) return *this;
    delete p;
    p = new Test(*rhs.p);
    return *this;
    }

    3.如果new时候发生异常,如何处理? this.p指针就是野指针了
    ManTest& operator = (const ManTest& rhs)
    {
    if(this == &rhs) return *this;
    Test *pTemp = p; //定义一个中介值
    p = new Test(*rhs.p);
    delete pTemp;
    return *this;
    }

    这样如果new发生异常,不会继续向下指向,p指向原来的内存空间就不会被删除

    4.定义一个swap()函数
    void swap(ManTest rhs) //注意这里参数类型不是ManTest &rhs;
    {....} //按值传参会有一份副本产生,这里将副本的数据赋给this,这样rhs的原来数据不会改变

  • 相关阅读:
    ios swift模仿qq登陆界面,xml布局
    类和结构体的区别
    获取或者设置时,无后缀和A后缀和W后缀的区别
    mfc控件学习
    MFC之简单计算器
    双冒号、点操作、箭头的区别
    MFC使用MsComm做串口通信
    保存结构体到本地(二进制)
    文件管理函数
    文件定位的几个函数
  • 原文地址:https://www.cnblogs.com/bizhu/p/2612626.html
Copyright © 2011-2022 走看看