我们知道在c++中的字符串有自己的库,在使用时,只需要添加string头文件即可,而且,c++中的字符串更为灵活,使用了类来封装字符串,比起c语言对字符串的操作,c++简直是随心所欲,我们通过自己封装string类的构造函数,拷贝构造函数,以及输出,赋值等来体会一下,string库的实现。
下面先给出代码:
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
//字符串类
class String
{
private:
char * m_data;//存放字符串
public:
String(const char* str=NULL);//普通构造
String(const String& other);//拷贝构造
String& operator=(const String& other);//赋值构造
String& operator+=(const String& str1);
friend String operator+(const String& str1,const String& str2);
~String(void);//析构函数
friend ostream& operator<<(ostream& out,String& m);
};
String operator+(const String& str1,const String& str2)
{
int length=strlen(str1.m_data)+strlen(str2.m_data);
String* str=new String[sizeof(str1)+sizeof(str2)];
strcpy(str->m_data,str1.m_data);
strcat(str->m_data,str2.m_data);
return *str;
}
String& String::operator+=(const String& str1)
{
int length=strlen(m_data)+strlen(str1.m_data);
String* str=new String(m_data);
delete m_data;
m_data=new char[length+1];
strcpy(m_data,str->m_data);
strcat(m_data,str1.m_data);
delete str;
return *this;
}
ostream& operator<<(ostream& out,String& m)
{
return out<<m.m_data;
}
String::String(const char* str)
{
if(str==NULL)
{
m_data=new char[1];
*m_data='\0';
}
else
{
int length=strlen(str);
m_data=new char[length+1];
strcpy(m_data,str);
}
}
String::String(const String& other)
{
int length=strlen(other.m_data);
m_data=new char[length+1];
strcpy(m_data,other.m_data);
}
String& String::operator=(const String& other)
{
if(this==&other)
{
return *this;
}
delete m_data;
int length=strlen(other.m_data);
m_data=new char[length+1];
strcpy(m_data,other.m_data);
return *this;
}
String::~String(void)
{
delete []m_data;
}
int main()
{
String str1("hello");
String str2("world");
String str;
str=str1+str2;
cout<<str<<endl;
}
这里的成员函数以及输出我都调试好了,可以看出,只是使用了c语言中的库函数封装,正好c++提供了重载运算符的功能,在这里可以很方便的使用。至于其他功能,大家可以自己试试,有了面向对象的思想,这些并不复杂!