码迷,mamicode.com
首页 > 其他好文 > 详细

简单实现string类

时间:2016-04-05 14:15:46      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:深拷贝


简单实现string类,正确管理资源。

1、首先定义它的成员变量:

private:
    char* _data;//定义一个字符指针

2、实现它的构造函数:

String(const char* str="") //如果定义对象时没有传参数,使用缺省构造参数构造出""字符串
    :_data(new char[strlen(str)+1])    //+1表示多创建一个空间存‘\0‘
{
    strcpy(_data,str);
}

3、实现拷贝构造

如果我们在实现拷贝构造时(赋值运算符重载类似),进行简单赋值的浅拷贝

String(const String& s)
         : _data(s._data)
    {}

当类里面有指针对象时,进行简单赋值的浅拷贝,两个对象指向同一块内存,析构时delete两次一个内存块,会崩溃。所以必须进行深拷贝

String(const String& s)
    :_data(new char[strlen(s)+1])
{
    strcpy(_data,s._data);
}

现代写法

//利用构造函数,传入s._data创建对象tmp,然后交换_data,tmp._data。此时_data指向根据构造函数new出来的新数据,即_data指向tmp._data,而tmp._data指向NULL。出了函数作用域后,自动调用tmp的析构。这种写法可以只用在构造和析构里,开辟空间或释放空间。

String(const String& s)
    :_data(NULL)
{
    String tmp(s._data);
    swap(_data,tmp._data);
}

4、实现赋值运算符重载

String& operator=(const String& s)
{
    if(this!=&s)
    {
        delete []_data;//如果此时的对象是缺省参数构造的,也会开辟空间存‘\0‘,所以都得delete
       _data=new char[strlen(s._data)+1];
        strcpy(_data,s._data);
    }
    return *this;
}

现代写法

//String s此时参数没有传&,实参传进来时,会调用拷贝构造函数 s(实参),swap后_data指向s._data,而s出作用域后被析构
String& operator=(String s)           
{
	swap(_data,s._data);
	return *this;
}

如果此时this=&s,那么会多开辟一块空间,来保存相同的字符串,这样会浪费空间,改进后的代码:

String& operator=(const String& s)
{
    if (this != &s)
    {
        String tmp(s._data);
        swap(tmp._data);
    }
	return *this;
}

5.析构

~String()
{
    if(_data)
    {
        delete[] _data;
        _data=NULL;
    }
}





简单实现string类

标签:深拷贝

原文地址:http://wanggaojun.blog.51cto.com/11409446/1760363

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!