【c++】String类的深浅拷贝

浅拷贝 ##—–位拷贝

浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。
- 概念:
将一个对象中的内容原封不动的拷贝到另一个对象中,多个对象共享同一个资源。

  • 后果:
    在销毁对象时一个资源被释放多次引起程序崩溃。

这里写图片描述

class String
{
public:
    String(const char* pStr = "")
        :_pStr(new char[strlen(pStr)+1])
    {
        strcpy(_pStr, pStr);
    }

    ~String()
    {
        if (_pStr)
            delete[] _pStr;
    }
private:
    char* _pStr;

};
void Test()
{
    String s1("hello world");
    //当类里面有指针对象时,拷贝构造和赋值运算符只进行值拷贝,
    //两个对象共用同一块资源,对象销毁时程序会发生内存访问违规
    String s2(s1);
}

深拷贝

深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变。
这里写图片描述
实现String类的深拷贝传统写法

class String
{
public:
    String(const char *str = "")
    {
        if (NULL == str)
            _str = "";
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);
    }
    String(const String& str)
        :_str(new char[strlen(str._str)+1])
    {
        strcpy(_str, str._str);
    }

    String& operator=(const String& str)
    {
        if (this != &str)
        {
            char* tmp = new char[strlen(str._str) + 1];
            strcpy(tmp, str._str);
            delete[] _str;
            _str = tmp;

        }
        return *this;
    }

    ~String()
    {
        if (_str)
        {
            delete[] _str;
        }
    }
private:
    char *_str;
};

void TestString()
{
    String s1("thanks");
    String s2(s1);
    String s3 = s2;

}

实现String类的深拷贝的现代写法:

class String
{
public:
    String(const char *str = "")
    {
        if (NULL == str)
            _str = "";
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);

    }
    String(const String& str)
        :_str(NULL)
    {
        String tmpStr(str._str);
        swap(_str, tmpStr._str);
    }
    /*    第一种写法   */
    /*String& operator=(const String& str)
    {
        if (this != &str)
        {
            String tmpStr(str._str);
            swap(_str, tmpStr._str);
        }
        return *this;
    }*/
    /*   第二种写法   */
    String& operator=(String str)
    {
        swap(_str, str._str);
        return *this;
    }
    ~String()
    {
        if (_str)
        {
            delete[] _str;
        }
    }
private:
    char *_str;

};
void TestString()
{
    String s1("hali");
    String s2(s1);
    String s3 = s1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值