深拷贝 —— String类的实现

在学习c++的时候我发现string的功能很强大,我觉得有必要来实现一下它,这次实现使用的时深拷贝的方法。

首先我们先来看看深浅拷贝的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象 中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一 个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对 象中对应字段的内容。

代码如下:

<strong><span style="font-size:18px;">#include<iostream>
#include<cstring>
using namespace std;

class String
{
	friend ostream& operator<<(ostream& os, const String& s);
	
public:
	String (char* str="")
		:_str(new char[strlen(str)+1+4]),_sz(strlen(str)),_capacity(strlen(str)+1)
	{
		strcpy(_str, str);
	}
	~String()      //析构
    {  
        if (_str != NULL)  
        {  
            delete[] _str;  
            _sz= 0;  
            _capacity= 0;  
        }  
    }
	String(const String &s)  //拷贝构造
        :_str(new char[strlen(s._str) + 1])  
    {  
        _sz = s._sz;  
        _capacity = s._capacity;  
        strcpy(_str, s._str);  
    }
	const char *c_str() const  //获取c风格的字符指针
    {  
        return _str;  
    }
	String& operator=(String s)     //赋值运算符重载  
    {  
        _sz = s._sz;  
        _capacity = s._capacity;  
        std::swap(s._str, _str);  
        return *this;  
    }
	char operator[](int sz)  //[]的重载
    {  
        return _str[sz];  
    }  
    String& operator+=(const String& s)  //+=重载
    {  
        CheckCapacity(strlen(s._str));  
        strcat(_str, s._str);  
        return *this;  
    }
	size_t	size()const 
	{
		return strlen(_str);
	}

	void  PushBack(char c)  //尾插
	{
		CheckCapacity(1);
		_str[_sz++]=c;
		_str[_sz]='\0';
	}

	 String& Insert(size_t pos,const char *str)//指定位置插入
	 {
		 char*tmp = new char[strlen(_str+pos)];
		 strcpy(tmp,_str+pos);
		 CheckCapacity(strlen(str));
		 while (*str)
		 {
			 _str[pos++]= *str;
			 str++;
		 }
		 strcpy(_str+pos,tmp);
		 return *this;
	 }
	 
	

	void CheckCapacity(int sz)   //检测容量是否够用,不够则重新开辟  
    {  
        int tmp = 0;
        if (_capacity<(sz + _sz + 1))  
        {  
            tmp = (2 * _capacity > _capacity + sz) ? 2 * _capacity : _capacity + sz;  
            char *str = new char[_capacity];  
            strcpy(str, _str);  
            delete[] _str;  
            _str = new char[tmp];  
            strcpy(_str, str);  
            _capacity = tmp;  
        }  
    }

private:
	char* _str;
	int _sz;
	int _capacity;
};
ostream& operator<<(ostream& os, const String& s)  //输出运算符重载
{  
    os << s._str;  
    return os;  
} 

void test()
{
	String s1("abc");  
    String s2(s1);
	cout<<s2<<endl;
    String s3;
	s3=s1;
	cout<<s3<<endl;
	String s4("def");
	s1+=s4;
	cout<<s1<<endl;
	cout<<s1[2]<<endl;
	cout<<s1.size()<<endl;
	s1.PushBack('p');
	s1.PushBack('p');
	cout<<s1<<endl;
	s1.Insert(3," ooooo ");
	cout<<s1<<endl;

}

int main()
{
	test();
	getchar();
	return 0;
}</span></strong>


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值