首页 > 编程语言 > 详细

C++ 深拷贝浅拷贝

时间:2020-09-28 23:30:20      阅读:46      评论:0      收藏:0      [点我收藏+]
/*深拷贝用来解决浅拷贝造成的两次析构问题,因为浅拷贝时,两个指针指向同一块内存空间,析构时,一块内存空间释放两次,系统会报错。因此,我们需要重新开辟一块内存空间,使两个指针指向不同的空间,以此来解决问题。下面用一个String的例子来验证深拷贝。*/
#include <iostream>
#include <cstring>
class String
{
public:
    String(const char *s = " ") : mPstr(new char[strlen(s) + 1]) //利用列表初始化为mPstr在堆上创建一个内存空间
    {
        strcpy(mPstr,s);
    }
    String(const String &other) : mPstr(new char[strlen(other.mPstr) + 1])
    {
        strcpy(mPstr, other.mPstr);
    }

    ~String()
    {
        delete []mPstr;
    }

    void show() const
    {
        cout << mPstr << endl;
    }

    void append(const String &other)  //实现一个追加功能
    {
        char *p = new char[strlen(this->mPstr) + strlen(other.mPstr) + 1];
        strcpy(p, this->mPstr);
        strcat(p, other.mPstr);
        delete []this->mPstr;
        mPstr = p;
        //因为p是局部变量,所以不需要手动销毁
    }

    void assign(const String &other) //实现一个覆盖功能
    {
        if(this != &other)           //如果覆盖的字符是本身,就不覆盖
        {
        char *p = new char[strlen(other.mPstr) + 1];
        strcpy(p, other.mPstr);
        delete []this->mPstr;
        mPstr = p;
        }
    }

private:
    char *mPstr;
};

int main(void)
{
    String s1("Hello");
    s1.show();
    String s2("World");
    s2.show();
    s1.append(s2);
    s1.show();
    s1.assign(s2);
    s1.show();
}

C++ 深拷贝浅拷贝

原文:https://www.cnblogs.com/wsl540/p/13747277.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!