string类的默认成员函数、增删查改实现

#include<iostream>
#include<assert.h>
using namespace std;
class String
{
public:
	String(char* _str="")
		//:p_str((char*)malloc(strlen(_str)+1))
            //效果一样,但之前没考虑清楚,误打误撞对了,没注意,开辟空间应于_capacity相等
	{
		cout<<"构造函数"<<endl;
		_size=strlen(_str);
		_capacity=_size+1;
		p_str=new char[_capacity];
		strcpy(p_str,_str);
	}
	//深拷贝
	String(const String& s)
		:p_str(NULL)
	{
		cout<<"拷贝构造"<<endl;
		String tmp(s.p_str);
		swap(p_str,tmp.p_str);
		//String(p_str);
		swap(_size,tmp._size);
		swap(_capacity,tmp._capacity);
	}
	~String()
	{
		cout<<"析构函数"<<endl;
		if(p_str)
		{
			free(p_str);
			p_str=NULL;
		}
	}
	void Display()
	{
		cout<<p_str<<endl;
	}
	void CheckCapacity(size_t capacity)
	{
		while(capacity>_capacity)
		{
			_capacity+=10;
			p_str=(char*)realloc(p_str,_capacity);
			assert(p_str);//检查新开辟是否成功
		}
	}
	//浅拷贝
	String& operator=(const String & s)
	{
		if(this==&s)
		{
			return *this;
		}
		p_str=s.p_str;
		//String(p_str);//为什么不可以//应该赋值给一个变量
		_size=s._size;
		_capacity=s._capacity;
		return *this;
	}
	String& operator +(const String& s)//第一个&有什么用
	{
		//assert((p_str)&&(s.p_str));
		//char* tmp=new char[_size+s._size+1];
		//这儿没有检查capacity要是_size比它大了怎么办
		//strcpy(tmp,p_str);
		//tmp[_size]='\0';
		//strcat(tmp,s.p_str);
		//String str(tmp);//为什么析构了
		//return str;
		size_t capacity=_size+s._size+1;
		CheckCapacity(capacity);
		strcat(p_str,s.p_str);
		String(p_str);
		return *this;
		
	}
	bool operator==(String& s)
	{
		if(_size!=s._size)
		{
			return false;
		}
		else
		{
			int ret=strcmp(p_str,s.p_str);
			if(ret==0)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
	}
	bool operator!=(String& s)
	{
		return !(*this==s);
	}
	bool operator>(String& s)
	{
		int ret=strcmp(p_str,s.p_str);
		if(ret>0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	bool operator>=(String& s)
	{
		return (*this>s)||(*this==s);
	}
	void PushBack(char ch)
	{
		size_t capacity=_size+2;
		CheckCapacity(capacity);
		p_str[_size]=ch;
		p_str[_size+1]='\0';//老是忘记这步
		_size+=1;
	}
	void PushBack(char* _str)
	{
		assert(_str);
		size_t len=strlen(_str);
		size_t capacity=_size+len+1;
		CheckCapacity(capacity);
		strcat(p_str,_str);
		p_str[capacity]='\0';
		_size+=len;
	}
	void PopBack(char* _str)
	{
		assert(_str);
		
	}
	void Insert(size_t pos,char* _str)
	{
		assert(pos&&_str);
		size_t len=strlen(_str);
		size_t capacity=_size+len+1;
		CheckCapacity(capacity);
		p_str[_size]=' ';
		for(size_t begin=_size;begin>pos;begin--)
		{
			p_str[begin+len-1]=p_str[begin-1];
			//(记得—1)指针下标和字符串的有效个弄混了
		}
		strncpy(p_str+pos,_str,len);
		p_str[capacity]='\0';
		_size+=len;//易忘
	}
	int Find(const char* _str)//注意加上const
	{
		size_t srcIndex=0;
		size_t destIndex=0;
		char* tmp=_str;
		char* cur=p_str;
		while((*cur!='\0')&&(destIndex!=strlen(_str)))
		{
			if(*cur!=*tmp)
			{
				cur++;
			    srcIndex++;
				if(destIndex!=0)
				{
					tmp=_str;
				    destIndex=0;
				    cur--;
				    srcIndex--;
				}
			}
			else
			{
				cur++;
			    srcIndex++;
				tmp++;
				destIndex++;
			}
		}
		if(*cur=='\0')
		{
			return -1;
		}
		else
		{
			return srcIndex-strlen(_str);
		}
	}
private:
	char* p_str;
	size_t _size;
	size_t _capacity;
};
void Test1()
{
	String s1="abc";//构造函数是什么时候析构的~建完,程序完时?
	String s(s1);
	s.Display();
	int ret1=(s==s1);
	cout<<ret1<<endl;
	int ret0=(s!=s1);
	cout<<ret0<<endl;
	s=s+s1;
	s.Display();
	int ret2=(s==s1);
	cout<<ret2<<endl;
	/*int ret0=(s!=s1);
	cout<<ret0<<endl;*/
	/*int ret3=(s1>s);
	cout<<ret3<<endl;*/
	int ret3=(s>s1);
	cout<<ret3<<endl;
	int ret4=(s1>=s);
	cout<<ret4<<endl;
	/*int ret4=(s>=s1);
	cout<<ret4<<endl;*/
}
void Test2()
{
	String s="hell";
	s.PushBack('o');
	s.Display();
	s.PushBack(" wd");
	s.Display();
	s.Insert(7,"orl");
	s.Display();
	int ret1=s.Find("el");
	cout<<ret1<<endl;
	int ret2=s.Find("lo");
	cout<<ret2<<endl;
	int ret3=s.Find("lf");
	cout<<ret3<<endl;
}
int main()
{
	//Test1();
	Test2();
	system("pause");
	return 0;
}