剑指刷题笔记一:赋值运算符函数

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 剑指刷题笔记一:赋值运算符函数,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

  • 题目:如下为类型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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!