首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
类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
100
问题
类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://kaotiyun.com/show/gRmZ777K
0
程序员面试
相关试题推荐
TheMagicofSoundMusicisoneofthemostbeautifulformsofartisticexpressionseverinvented.Inmoviesandplays,musi
Directions:Inthissection,youareaskedtowriteanessaybasedonthefollowinginformation.Makecommentsandexpressy
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。
不开辟新空间完成字符串的逆序
在Excel中,函数ABS(ROUND(-1.478,2))的计算结果是()。A.-1.478B.1.48C.-1.48D.1.5
路由器的主要作用是()。
一个软件的架构设计是随着技术的不断进步而不断变化的。以编译器为例,其主流架构经历了管道—过滤器到数据共享为中心的转变过程。以下关于编译器架构的叙述中,错误的是______。
对计算机评价的主要性能指标有时钟频率、①、运算精度和内存容量等。对数据库管理系统评价的主要性能指标有②、数据库所允许的索引数量和最大并发事务处理能力等。①处应填入?
随机试题
下列哪种说法是正确的
A.风气内动B.寒从中生C.湿浊内生D.津伤化燥E.火热内生阳气虚衰、脏腑功能不足所产生的阴寒证候均为
男,50岁。因腹胀半月就诊。查体:可见腹壁静脉曲张,血流方向自下而上,双下肢水肿。最可能的病因是
某市政府正筹建本市公园,鉴于资金短缺,便作出一项决定,要求本市所有公务员每人资助100元,违者则给予警告或降级处分。该市税务局公务员王某,因拒绝交纳,被市政府给予警告处分。王某不服,遂向市人民法院提起行政诉讼,要求人民法院撤销市政府的决定,并责令撤销市政府
(2009年)设A为m×n的非零矩阵,B为n×l的非零矩阵,满足AB=0,以下选项中不一定成立的是()。
权利人在法定期间内,不行使权利即丧失请求人民法院保护其胜诉权利的是()。
甲企业2012年度利润表有关资料如下:(1)“主营业务收入”科目的贷方发生额为300万元,借方发生额为30万元(11月发生的购买方退货),“其他业务收入”科目的贷方发生额为22万元。(2)“主营业务成本”科目的借方发生额为150万元;2
()是创造性思维的重要成分,在各种创造性活动中都起着重要作用,贯穿整个创造活动的始终。
生产力对教育的制约作用主要表现在()。
有一个仓库,可以存放A和B两种产品,但要求:(1)每次只能存入一种产品(A或B);(2)一N
最新回复
(
0
)