首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
类CMyString的声明如下: class CMyString { public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void);
类CMyString的声明如下: class CMyString { public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void);
admin
2019-03-29
99
问题
类CMyString的声明如下:
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
private:
char* m_pData;
};
请实现其赋值运算符的重载函数,要求异常安全,即当对一个对象进行赋值时发生异常,对象的状态不能改变。
选项
答案
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; } 该方案通过调用构造拷贝函数创建一个临时对象来分配内存。此时即使发生异常,对原来对象的状态没有影响。交换临时对象和需要赋值的对象的字符串指针之后,由于临时对象的生命周期结束,自动调用其析构函数释放需赋值对象的原来的字符串空间。整个函数不需要显式用到new、delete,内存的分配和释放都自动完成,因此代码显得比较优雅。
解析
首先我们来看一般C++教科书上给出的赋值运算符的重载函数:
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;
}
我们知道,在分配内存时有可能发生异常。当执行语句new char[strlen(str.m_pData) + 1]发生异常时,程序将从该赋值运算符的重载函数退出不再执行。注意到这个时候语句delete []m_pData已经执行了。也就是说赋值操作没有完成,但原来对象的状态已经改变。也就是说不满足题目的异常安全的要求。
为了满足异常安全这个要求,一个简单的办法是掉换new、delete的顺序。先把内存new出来用一个临时指针保存起来,只有这个语句正常执行完成之后再执行delete。这样就能够保证异常安全了。
转载请注明原文地址:https://jikaoti.com/ti/2fg7FFFM
0
程序员面试
相关试题推荐
TheMagicofSoundMusicisoneofthemostbeautifulformsofartisticexpressionseverinvented.Inmoviesandplays,musi
Writeanessaybasedonthefollowingoutline.Youshouldwriteabout150wordsontheANSWERSHEET.1.教师用课外时间给学生补课赚钱的现象
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
组合问题(从M个不同字符中任取N个字符的所有组合)
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
使用.NETPassport向导注册MSN帐户,姓名为李明,邮件的地址为liming@hotmail.com,密码为123456lm。
Powerpoint2000中,使用()菜单中的“幻灯片母版”命令,进入幻灯片母版设计窗口,更改幻灯片的母版。A.编辑B.工具C.视图D.格式
阅读以下关于I/O系统处理能力评估的说明,在回答问题1至问题3。拟建设的某事务处理系统数据交换非常频繁。经过初步分析,存储子系统的I/O性能决定了整个系统的响应时间。目前主流磁盘的容量为40GB和80GB两种规格。采用不同规格的磁盘,存储子系统的I
随机试题
患者,女性,17岁,颏部外形发育不良,口唇闭合时口腔周围肌肉呈现紧张状态,面下1/3高度偏大,开颌5mm,覆盖8mm,磨牙呈现完全的Ⅱ类咬合关系,上下颌前牙拥挤明显,前牙开颌,左右上中切牙唇侧扭转,左右上侧切牙完全腭侧错位,左右上尖牙低位唇向错位,ANB
下颌关节摄影检查的常规体位是
男,45岁。风湿性二尖瓣狭窄20年,持续性心房颤动5年。1天前突发晕厥、摔倒,左侧肢体活动障碍。该患者目前最可能的诊断是
男,42岁。毕Ⅱ式胃大部切除术后两年,上腹部有烧灼感,抗酸剂治疗无效,有时呕吐。内含胆汁,吐后腹痛无缓解,体重减轻。胃镜下黏膜充血,水肿、易出血。最可能的诊断是
以下是小许同学在学习《产品质量法》中的认识,其中正确的是()
非高层民用建筑中,一、二级耐火等级的建筑与三级耐火等级的建筑之间的防火间距不应小于()。
从人口的空间布局看,城镇化是农村人口向城镇转移,是农民向市民的转变。农民向市民的转变过程,是人的素质的现代化过程。而人的素质的现代化离不开接受现代化的教育。人的教育的现代化是城镇化的基础和支撑。城镇化还意味着人们的就业和生产从农业领域向工业和服务业的转移。
按照法治思维,权利与权力之间的关系表现为()
(00年)在电炉上安装了4个温控器,其显示温度的误差是随机的.在使用过程中,只要有两个温控器显示的温度不低于临界温度t0,电炉就断电.以E表示事件“电炉断电”,而T(1)≤T(2)≤T(3)≤T(4)为4个温控器显示的按递增顺序排列的温度值,则事件E等于
Iwasafraid.Thetruthis,IwasafraidthedayIwalkedintoStanford.AndIwasafraidthedayIwalkedout.Iwasscaredof
最新回复
(
0
)