模拟实现string(深浅拷贝,传统现代写法)

来源:互联网 发布:unity3d 联机游戏 编辑:程序博客网 时间:2024/06/17 04:06

模拟实现string

浅拷贝

首先我们了解一下浅拷贝
浅拷贝是系统自动生成的也叫做值拷贝。

class String{public:    String(char* str)        :_str(str)    {}    String(const String& s)        :_str(s._str)    {}   ~String()    {        delete[] _str;    } 只能释放一次private:    char* _str;};void Test1(){    String s1("s1");    String s2(s1);}

我们在运行这段代码时候程序会崩溃,这是为什么呢,用一幅图理解一下
11

出现这种问题我们的解决方案有两种
1,深拷贝
2,写时拷贝

深拷贝的写法有两种
一种是传统写法一种是现代写法

深拷贝——传统写法

class String{public:    String(char* str = "")//无参函数也可用        :_str(new char[strlen(str) + 1])    {        strcpy(_str, str);    }    //传引用返回可以提高效率,并且出了作用域对象还存在    String(const String &s)        :_str(new char[strlen(s._str)+1])    {        strcpy(_str, s._str);    }    char &operator[](size_t pos)    {        return _str[pos];    }    String &operator=(const String &s)    {        if (this != &s)        {            delete _str;            _str = new char[strlen(s._str) + 1];            strcpy(_str, s._str);        }        return *this;    }    ~String()    {        delete[] _str;    }    const char* GETStr()    {        return _str;    }private:    char*_str;};

深拷贝——现代写法

class String{public:    String(char* str = "")//无参函数也可用        :_str(new char[strlen(str) + 1])    {        strcpy(_str, str);    }    String(const String &s)        :_str(NULL)    {        String tmp(s._str);        swap(_str, tmp._str);    }    char &operator[](size_t pos)    {        return _str[pos];    }    String &operator=(const String &s)    {        if (this != &s)        {            String tmp(s);            swap(_str, tmp._str);        }        return *this;    }    String &operator=(String s)    {        swap(_str, s._str);        return *this;    }    ~String()    {        delete[] _str;    }    const char* GETStr()    {        return _str;    }private:    char*_str;};

这是我们深拷贝的两种写法
那么深拷贝在析构函数这里是怎么做到的呢
23

总结传统写法和现代写法:
传统写法:可读性高
现代写法:简洁 ,new/delete都在统一的地方,可维护性高