首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
类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
140
问题
类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
程序员面试
相关试题推荐
TheGreeksassumedthatthestructureoflanguagehadsomeconnectionwiththeprocessofthought,whichtookrootinEuropelon
Weakdollarorno,$46,000—thepriceforasingleyearofundergraduateinstructionamidtheredbrickofHarvardYard—is【C1】__
如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个
某队列的声明如下:templateclassCQueue{public:CQueue(){}~CQueue(){}voidappendTail(constT&node);//appendaelementto
什么是ASP.net中的用户控件
两个单向链表,找出它们的第一个公共结点。链表的结点定义为:structListNode{intm_nKey;ListNode*m_pNext;};
ASP.NET与ASP相比,主要有哪些进步?
为邮件到达后应用规则“若发件人包含‘mary@sina.com’转发到wangtao@sina.com”。
将上题的规则应用到已下载的邮件。
Excel2000中,列标()A.可以用各种符号表示B.用数字表示C.用字母表示D.可以用中文文字表示
随机试题
下列不构成专利权终止的法律事实是()
口底及颌下的急性蜂窝织炎危及生命的并发症是【】
十二指肠切除,可影响下述哪些营养素的吸收()。
设计利用穿堂风进行自然通风的板式建筑。其迎风面与夏季最多风向的夹角宜为()。
分析评价开发区规划实施对生态环境的影响,主要包括()影响。
2019年12月11日晚8时15分许,某建筑高度达50m的大型商场,因发电机组电气线路短路形成高温电弧,引燃周围装饰材料并蔓延成火灾。在事故发生的第一时间,法人代表李某(该商场的消防安全责任人)立即启动应急预案,同时组织单位的义务消防队扑救火灾。与此同时,
企业发行的可转换公司债券,期末按规定计算确定的利息费用进行账务处理时,可能借记的会计科目有()。
党章规定:我国社会各方面的基层单位只要有党员三人以上的,都要成立党的基层组织。()
根据下面材料回答下列题。2007年7月份北京市下列各区县中城镇居民最低生活保障人数最少的是()。
尽管这名病人被诊断为植物状态,但她保留了理解口头______并通过大脑活动、而非语音或动作做出______的能力。“欧文表示:”她决定与我们合作,根据我们的______想象特定的任务,这是一个清楚的______行为,确凿无疑地证明,她有意识地认识自己
最新回复
(
0
)