首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
类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
125
问题
类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
程序员面试
相关试题推荐
TheSecondWorldWar,______theearlieronein1914,promptedpublicconcernaboutthephysicalandintellectualwell-beingoft
Directions:Inthissection,youareaskedtowriteanessaybasedonthefollowinginformation.Makecommentsandexpressy
输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。
邮件的删除。
在即时通讯工具MSN中,从当前界面开始,把自己的邮箱注册为“Passport”,已知邮箱地址为:ccty@163.com,密码设置为116116,密码提示问题为:你最喜欢的历史人物?毛泽东,注册检查框内的字符按照图片上给的输入,字符输入区分大小写,其余选项
Powerpoint2000中,使用()菜单中的“幻灯片母版”命令,进入幻灯片母版设计窗口,更改幻灯片的母版。A.编辑B.工具C.视图D.格式
在foxpro中定义数据库结构时,字段名的宽度最多可以是()。A.2B.4C.10D.16
下列有关break和continue语句的叙述中,正确的是________。
对计算机评价的主要性能指标有时钟频率、①、运算精度和内存容量等。对数据库管理系统评价的主要性能指标有②、数据库所允许的索引数量和最大并发事务处理能力等。①处应填入?
随机试题
A.李东垣B.钱乙C.秦景明D.张景岳E.王清任
患者,女,34岁。平素多忧思抑郁,失眠,心悸,与人争吵后,突然呼吸短促,息粗气憋,胸闷胸痛,咽中如窒,但喉中痰鸣不著,苔薄,脉弦。该患者治疗时,宜首选
对偶然性消化不良或进食蛋白食物过多者可选()
关于子宫内膜异位症防治的叙述,不正确的是()。
某企业在2010年10月8日销售商品:100件,增值税专用发票上注明的价款为20000元,增值税额为3400元。企业为了尽早收回货款而在合同中规定的现金折扣条件为:2/10,1/20,N/30。假定计算现金折扣时不考虑增值税。如买方2010年10月24日付
根据《旅行社条例实施细则》的规定,旅行社及其委派的导游人员和领队人员的下列()行为,属于擅自改变旅游合同安排行程。
(2017·山东)探究学习以学生为学习主体,能够解放学生的思维;而接受学习不以学生为主体,限制学生的思维。()
某市某区人民政府决定将区建材工业局管理的国有小砖厂出售。小砖厂的承包人以侵犯其经营自主权为由提出行政复议申请,本案的行政复议机关应当是下列哪一个?()
根据以下资料,回答以下题。截至2011年末,T市城镇职工基本医疗保险参保人员474.52万人,城乡居民基本医疗保险参保人员498.30万人,城镇职工基本养老保险参保人员458.70万人,城乡居民基本养老保险参保人员97.80万人,失业保险参保职工
函数调用"strcat(strcpy(str1,str2),str3)"的功能是()
最新回复
(
0
)