我们都知道处理字符串一类的问题,可以使用C++标准中string类。

  C++标准中string类的功能是非常强大的。要想使用C++标准中的string,需要包含头文件<string>,而不是<string.h>。(.h是C语言的头文件)

 string类有默认的构造函数和赋值函数。若采用系统默认的,则会出现浅拷贝(写时拷贝)。若重写构造函数和赋值函数,则会出现深拷贝。


浅拷贝:拷贝构造函数和赋值函数后,两个指针指向同一块空间。

深拷贝:拷贝构造函数和赋值函数后,两个指针指向各自的空间。

C++ string类的简单实现_string


本篇博客简单的实现了string类,重写了拷贝构造函数和赋值函数,出现深拷贝。

若想知道string类如何实现浅拷贝,请关注下一篇博客哟。。。


 下面就简单实现string类:


#include <iostream>

#include <assert.h>


using namespace std;

class String

{

public:

String(char *str = "")

:_str(new char[strlen(str)+1])//最少要开辟一个字符的空间存'\0'

{

cout<<"String()"<<endl;

strcpy(_str,str);//初始化

}

~String() //析构

{

cout<<"~String()"<<endl;

if(_str != NULL)

{

delete[] _str;

}

}

String(const String& str)

:_str(NULL)//_str(new char[1])

{

cout<<"String(const String& str)"<<endl;

String tmp(str); //用str._str构造tmp

swap(_str,tmp._str);//交换_str和tmp._str的地址,出了作用域后tmp释放空间

}

/*String& operator=(const String& str)

{

cout<<"String& operator=(const String& str)"<<endl;

String tmp(str);

swap(_str,tmp._str);//交换地址,tmp为局部变量,出了作用域后tmp自动销毁

return *this;

}*/


String& operator=(const String str)//用str1构造str

{

swap(_str,tmp._str);//交换地址,出来作用域后,str自动销毁

return *this;

}


int _Strcmp(const char* dest,const char *src)  //比较字符串大小

{

assert(dest);

assert(src);

while(*dest == *src)

{

if(*dest == '\0')

return 0;

dest++;

src++;

}

return (*dest-*src);

}


bool operator==(String &str)//字符串是否相等

{

int ret = _Strcmp(_str,str._str);

if(ret == 0)

return true;

return false;

}


bool operator>(String &str)//重载>

{

int ret = _Strcmp(_str,str._str);

if(ret > 0)

return true;

return false;

}


bool operator!=(String &str) //重载!=

{

return !(_str == str._str);

}


    bool operator<(String &str)

{

return !((_str == str._str)&&(_str > str._str));

}


void insert(int pos,char ch) //在某个位置插入一个字符

{

int length = strlen(_str);

int i = 0;

for(i=0;i<length-pos+1;i++)

{

_str[length-i] = _str[length-1-i];

}

_str[pos-1] = ch;

_str[length+1] = '\0';

}


void _insert(int pos,char* str) //在某个位置插入一个字符串

{

int i = 0;

int j = 0;

int l1 = strlen(_str);

int l2 = strlen(str);

int size = l1-pos+1;

for(i=0;i<size;i++)

{

_str[l1-i+1] = _str[l1-i-1];

}

for(j=0;j<l2;j++)

{

_str[pos-1+j] = str[j]; 

}

_str[l1+l2] = '\0';


}

void insert2(int pos,char* str)

{

_insert(pos,str);

}


void insert3(int pos,const String& str)

{

   _insert(pos,str._str);

}


int size()  //字符串的长度

{

return strlen(_str);

}


void PushBack(int ch)  //在字符串后插入一个字符

{

int len = 0;

char *s_str = _str;

while(*s_str)

{

len++;

s_str++;

}

_str[len] = ch;

_str[len+1] = '\0';

}

private:

char *_str; //成员变量

};


int main()

{

String str1 = "bi";

///*String str2(str1);

//String str3;

//str3 = str1;*/

//String str2 = "bit";

////int ret = str2.operator ==(str1);

//int ret = str2 > str1;

//char *str = "xi";

String str1 = "zhang";

//str1.insert(2,'w');

//str1.insert2(3,str);

str1.insert3(1,str);

//int ret = str1.size();

//str1.PushBack('t');

//str.operator ==(str1);

return 0;

}