首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
类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
148
问题
类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://www.kaotiyun.com/show/gRmZ777K
0
程序员面试
相关试题推荐
TheUnitedStatesInterstateHighwaySystemisaninfrastructurefeatofunprecedentedproportions.Notonlydoesitjoinallfi
TheUnitedStatesInterstateHighwaySystemisaninfrastructurefeatofunprecedentedproportions.Notonlydoesitjoinallfi
求最大连续递增数字串(如“ads3sl456789DF3456ld345AA”中的“456789”)
存储过程和函数的区别
Word的样式是一组巳命名的字符和()格式的组合。
在Excel中,公式SUM(C2:C6)的作用是()。A.求C2到C6这五个单元格数据之和B.求C2和C6这两个单元格数据之和C.求C2和C6两单元格的比值D.以上说法都不对
改错题【要求】1)打开“T盘”中“P2vbp”文件,按参考界面形式编辑窗体界面,改正程序中的错误后,直接保存所有文件;2)改错时,不得增加或删除语句,但可适当调整语句位置。【题目】本程序的功能是生成由n(n通过InputBox函数输入)个3位升序
在数据库系统中,“事务”是访问数据库并可能更新各种数据项的一个程序执行单元。为了保证数据完整性,要求数据库系统维护事务的原子性、一致性、隔离性和持久性。针对事务的这4种特性,考虑以下的架构设计场景:假设在某一个时刻只有一个活动的事务,为了保证事务
在数据库系统中,“事务”是访问数据库并可能更新各种数据项的一个程序执行单元。为了保证数据完整性,要求数据库系统维护事务的原子性、一致性、隔离性和持久性。针对事务的这4种特性,考虑以下的架构设计场景:假设在某一个时刻只有一个活动的事务,为了保证事务
阅读以下关于税务管理系统方面的叙述,回答问题1和问题2。近年来,我国电子税务工作取得了长足进步,特别是2000年,税务管理信息化工作在国务院领导的直接关心和国家税务总局党组的具体指挥下,以五省四市“金税工程”的顺利开通、平稳运行为标志,取得了突破性
随机试题
A.直接作用于受体B.影响递质的储存C.影响递质的代谢D.影响递质的释放E.影响递质的生物合成新斯的明的主要作用是
护理慢性肾衰竭患者,每天最重要的是()
( )是招标和合同文件的组成部分,是一份以一定计量单位说明工程实物数量的明细文件。
某一类高层商住楼地上30层、地下2层,总建筑面积85694.81m2,地下一层至地上四层为商场,建筑面积为37275.01m2,地上四层以上为普通住宅,地下二层为汽车库。该商住楼内的防烟楼梯间及其前室、消防电梯间前室和合用前室,靠外墙布置具备自然排烟条件。
公司的现金最低持有量为1500元,现金余额的最优返回线为8000元。如果公司现有现金20000元,根据现金持有量随机模式,此时应当投资于有价证券的金额是()元。
我国现代歌剧《伤逝》是根据鲁迅的同名小说改编而成,1982年首演于北京。该作品是我国著名作曲家()创作的。
Heisthebestinvestmentadviserand______cantellyouwhichshareyoushouldbuy.
根据问题描述,填写图2-1中(1)~(4)处联系的类型。联系类型分为一对一、一对多和多对多三种,分别使用1:1,1:n或1:*,m:n或*:*表示。补充图2-1中的联系并指明其联系类型。联系名可为:联系1,联系2,…
若a=12,b=14,c=0,则表达式“((y=(a>B)?a:B)>C)?y:c”的值为【】。
A—groceryJ—furnitureshopB—roastmeatshopK—electricalapplianceshopC—foodanddrinkshopL—photographicstudioD—de
最新回复
(
0
)