Effective C++ 条款11

Effective C++ 条款11

大家好,又见面了,我是全栈君。

在operator=中处理“自我赋值”

什么是自我赋值,非常明显。

就是自己的值赋值给了自己。以下的代码就是自我赋值:

class Widget
{
public:
    Widget& operator=(const Widget& rhs)
    {
        delete p;
        p=new int(ths.p);
        return *this;
    }
    int *p;
};

Widget w1,w2;
w1=w2;
w1=w1;//自我赋值。

如上代码,自我赋值的时候会出现删除自身数据的操作,这样非常危急。由于p变成了野指针。

为了防止以上错误能够进行“自我測试”,假设发现是自我赋值就直接返回。

例如以下代码:

class Widget
{
public:
    Widget& operator=(const Widget& rhs)
    {
        if(this==&rhs)//自我測试
            return *this;
        delete p;
        p=new int(rhs.p);
        return *this;
    }
    int *p;
};

可是。以上代码有还有一个缺陷,就是一旦new一个新空间失败,p还是会变成野指针。
所以,能够先保存原来的数据,等new成功之后在进行数据替换;
再次改动代码例如以下:

class Widget
{
public:
    Widget& operator=(const Widget& rhs)
    {
        int tmp=p;//记录原先内存
        p=new int(rhs.p);
        delete tmp;//释放原先内存
        return *this;
    }
    int *p;
};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115960.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图解DataGridView编辑列

    WinForm中DataGridView功能强大,除了可以自动绑定数据源外,还可以根据需求编辑列。下面以截图说明添加编辑列的步骤(HoverTreeSCJ项目实际界面)。1.选择DataGridVi

    2021年12月27日
    46
  • C++生产和使用的临时对象

    C++生产和使用的临时对象

    2022年1月5日
    56
  • C语言和JAVA的区别[通俗易懂]

    C语言和JAVA的区别[通俗易懂]java语言和c语言的区别:un公司推出的Java是面向对象程序设计语言,其适用于Internet应用的开发,称为网络时代重要的语言之一。Java可以用认为是C的衍生语言,与C在大量元以内成分保持相同,例如此法结构、表达式语句、运算符等与C基本一致:但Java更简洁,没有C中冗余以及容易引起异常的功能成分,并且增加了多线程、异常处理、网络编程等方面的支持功能。本文从多角度对Java与C进行对比分析,为C与Java语言的学习提高一些借鉴。1、调法结构C与Java的词法结构很相似,针对程

    2022年7月7日
    24
  • Jps命令—使用详解[通俗易懂]

    Jps命令—使用详解[通俗易懂]原文:https://blog.csdn.net/wisgood/article/details/38942449 jps是jdk提供的一个查看当前java进程的小工具,可以看做是JavaVirtualMachineProcessStatusTool的缩写。非常简单实用。    命令格式:jps[options][hostid]     [options…

    2022年9月20日
    3
  • 花生壳安全吗_花生壳ddns怎么一直连接不上

    花生壳安全吗_花生壳ddns怎么一直连接不上dyndns和花生壳组织文化中最强大的方面以最小的个体姿态来实现,有时甚至不及花生。不久前,当我坐在达拉斯机场等待航班延误时,我看到另一个乘客在吃一些花生时感到不安。它们的贝壳掉落在地板上,几分钟后,乘客将它们踢入过道,大概是供机场清洁人员稍后收集。直到最近的一次内部RedHat活动中,有人问我有关我的宠物怒气冲冲,我才对花生壳没多加考虑。我开始考虑在RedHat浴室的地板…

    2025年6月11日
    2
  • idea2022.01.13激活码永久[最新免费获取]2022.02.05

    (idea2022.01.13激活码永久)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html76VF8VOVJM-eyJsaWNlbnNlSW…

    2022年4月1日
    103

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号