赋值运算符函数

来源:互联网 发布:java crm 开源 编辑:程序博客网 时间:2024/05/17 22:25

题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。

class CMyString{private:    char * m_pData;public:    CMyString(char *pData = NULL);    CMyString(const CMyString &str);    ~CMyString(void);};


这里要注意一下几点:

  • 是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(*this)。只有返回一个引用,才可以允许连续赋值。
  • 是否把传入的形参的类型声明为常量引用。如果传入的参数不是引用而是实例,那么从形参到实参会调用一次复制构造函数。
  • 是否释放实例自身已有的内存。如果忘记在重新分配内存之前释放自身已有的空间,程序将出现内存泄露。
  • 是否判断传入的参数和当前实例(*this)是不是同一个实例。

经典解法:

CMyString& CMyString::operator = (const CMyString *str){    if(this == &str)        return *this;    delete []m_pData;    m_pData = NULL;    m_pData = new char[strlen(str.m_pData) + 1];    strcpy(m_pData, str.m_pData);    return *this;}

考虑异常安全性的解法:

前面的函数中,我们在分配内存之前先用了delete释放了实例m_pData的内存。如果此时内存不足导致new char抛出异常,m_pData将是一个空指针,CMyString的实例不再保持有效的状态,这就违背了异常安全性原则。

办法是先创建一个临时实例,在交换临时实录和原来的实例。

CMyString& CMyString::operator = (const CMyString *str){    if(this != &str)    {        CMyString strTemp(str);        char *pTemp = strTemp.m_pData;        strTemp.m_pData = m_pData;        m_pData = pTemp;    }    return *this;}
由于strTemp是一个局部变量,程序运行到if的外面即除了改变量的作用域,就会自动调用strTemp的析构函数,把strTemp.m_pData所指向的内存释放掉。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为手机耳机怎么挂了电话怎么办 华为手机听筒声音小怎么办 华为p9手机听筒声音小怎么办 苹果6总是耳机模式怎么办 苹果没有插耳机模式怎么办 苹果手机切换耳机模式怎么办 苹果6s出现耳机模式怎么办 苹果6变成了耳机模式怎么办 苹果手机成耳机模式了怎么办 华为mate8耳机声音小怎么办 移动sim卡丢了怎么办 蓝牙耳机开不开机怎么办 苹果手机蓝牙不匹配怎么办 苹果6蓝牙坏了怎么办 蓝牙密钥不正确不匹配怎么办 华为p6开不了机怎么办 华为c199手机不停重启怎么办 华为手机用户数据被锁定怎么办 朵唯手机丢了怎么办 网件r6220穿墙差怎么办 无线网打王者卡怎么办 酷翼x9忘了密码怎么办 楼上的路由器楼下不好使怎么办 电信4g网络不好怎么办 农村只有2g网怎么办 电信卡4g网速慢怎么办 小米手机触屏失灵怎么办 荣耀v10电信网速很慢怎么办 华为路由器掉线了怎么办 三星s6只识别一张卡怎么办 华为手机卡不显示了怎么办 华为账号手机卡丢了怎么办 荣耀8耗电量太快怎么办 vivo卡2不显示怎么办 电信宽带玩王者荣耀卡怎么办 联通4g玩游戏卡怎么办 华为悦盒遥控器丢了怎么办 6s不能用电信卡怎么办 iphone6电信卡无服务怎么办 魅族手机电信卡怎么办 小米手机读不出sim卡怎么办