我们都知道处理字符串一类的问题,可以使用C++标准中string类。
C++标准中string类的功能是非常强大的。要想使用C++标准中的string,需要包含头文件<string>,而不是<string.h>。(.h是C语言的头文件)
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;
}