zoukankan      html  css  js  c++  java
  • 在赋值运算符中处理自我赋值问题

    自我赋值发生在对象被赋值给自己时,例如:

    val = val;

    vec[i] = vec[j];//潜在的自我赋值(i=j)

    *p = *q;潜在自我赋值

    class A

    {

    A& operator=(const A& rhs)//不安全的赋值版本

    {

            delete p;//停止使用当前的对象

            p = new P(rhs.p);//使用rhs的副本

            return *this;

    }

    B p;

    }

    解决方案一:使用证同测试

    A& operator=(const A& rhs)

    {

    if(this == &rhs) return *this;   //证同测试

    delete p;//停止使用当前的对象

    p = new B(rhs.p);//使用rhs的副本

    return *this;

    }

    这一版本存在异常安全性,如果new发生异常或者B使用copy构造异常,A最终会持有一个指针指向一块被删除的B

    解决方案二:记住原先的对象

    A& operator=(const A& rhs)

    {

    B *pp = p;//记住原先的p

    p = new B(rhs.p);//另p指向一个*p的副本

    delete pp;//删除原先的p

    return *this;

    }

  • 相关阅读:
    7、猜年龄
    6、continue语句
    5、break语句
    4、while循环练习
    poj 2378
    poj 2342
    poj 2287
    poj 2228
    poj 1191
    srm 578 dv2 1000pt
  • 原文地址:https://www.cnblogs.com/Mr-Zhong/p/4238388.html
Copyright © 2011-2022 走看看