- 题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char* pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
private:
char* m_pData;
};
- 答案:
CMyString& CMyString::operator = (const CMyString& str)
{
if(this == &str)
return *this;
delete []m_pData;
m_pData = nullptr;
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);
return *this;
}
- 分析:
从函数返回值开始,从前往后分析
①具有返回值,可以实现连续赋值,相当于,
CMString str1,str2,str3;
str1=str2=str3;
这里存在连续赋值,这是符合C++的语法规范的。
在这种情况下,赋值操作符返回一个引用类型,即str2=str3 返回的引用变量直接赋值给str1。
(注意:这里返回得应用变量正是*this,即str2指向的对象)
如果返回值是void,则应用该赋值运算符将不能进行连续赋值
②返回值为引用类型,提高了效率。不需要在返回时,调用一次赋值构造函数。
③参数类型为引用类型,不需要构造实例,提高了效率。
④判断传入实例和当前实例是否是同一个实例。
if(this == &str)
return *this;
这个操作可以避免下面释放内存时出现的问题:
在后续操作中,将会delete掉this指向的内存,然后再重新开辟。
但是,如果str和this指向的是同一个实例对象的话。
那么生命周期则是相同的。就会导致在delete掉this时,同时delete掉了传入的参数的内存。
进而导致再也找不到需要复值的内容了。
⑤释放原有内存,置空数据字符串指针。
⑥重新开辟空间,调用strcpy函数。
⑦返回值。
到此,这道题的分析就结束了,写文不易,欢迎各位点赞留言交流!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130592.html