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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharm怎么导包_python自动到包快捷键

    pycharm怎么导包_python自动到包快捷键其实在pycharm中导包极为便捷和方便,下面就和大家分享一下吧:首先点击file,再点击settings,再ProjectorInterpreter中点击,输入想要的包名,最后点击installpackage…

  • pdf下载插件tcpdf

    pdf下载插件tcpdfThinkphp框架引用tcpdf一:引入tcpdf整个文件夹到项目如下目录/ThinkPHP/Library/Vendor/tcpdftcpdfv6.2.12版本百度网盘下载链接:http://pan.baidu.com/s/1kVhrQoJ密码:bfh4二:简单的使用 三:关于下载PDF时,插件把中文文件名屏蔽了的解决方法四:把tcpdf中的插件引入到项目中

  • java程序设计图书管理系统源码(java图书管理系统设计报告)

    图书管理系统需实现的功能如下:(1)用户管理:包括用户的注册于登录。(2)图书管理:包括录入、查询、修改和删除图书信息。(3)借书:包括借阅图书和查看借书记录。(4)还书:包括还书和查看还书记录。(5)为了保证系统安全,进入系统时,对用户登录的密码进行加密与解密。源码、课程设计报告、数据库表图的百度网盘链接:https://pan.baidu.com/s…

  • Hdu1396「建议收藏」

    Hdu1396「建议收藏」//CountingTriangles/*顶角朝上的三角形:a[i]=a[i-1]+c(i+1,2)(从底边任选两点为正三角形底边)顶角朝下的三角形:b[i]=b[i-1]+c((i+1)/2,2)+c((i+2)/2,2)(因为偶数边长的正三角形和其边长一半的反三角形存在着对应关系,所以将底边所有的点分为两类:奇数和偶数点;再在相应的奇数…

  • DOS常用命令_dos格式化硬盘命令

    DOS常用命令_dos格式化硬盘命令启动方式1:进入DOS页面:win+R;键入:cmd启动方式2:“开始”→“运行”→输入“cmd”回车,此时将出现一个显示命令提示符的窗口,如下图。1,help命令:help——》查看所有命令帮助;help某某某——》查看具体某个命令的帮助2,dir命令该命令显示一个目录下的文件和子目录列表以及文件的其他详细资料,包括文件大小,创建日期和时间等。语法是:…

    2022年10月23日
  • window10 安装_自己安装windows10

    window10 安装_自己安装windows10AppFabric简介WindowsServerAppFabric扩展了WindowsServer以为Web应用程序和中间层服务提供增强的托管、管理和缓存功能。AppFabric托管功能向Internet信息服务(IIS)、WindowsProcessActivationService(WAS)和.NETFramework4添加了服务管理扩展。其中包

    2022年10月17日

发表回复

您的电子邮箱地址不会被公开。

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