c++中string 的实现
用c实现string类是c++面试中常考的一个题目、通过这道题可以反应出程序员对c++的最基本的功底——
对构造函数,拷贝构造函数、析构函数、内存管理、以及操作符重载为成员函数和非成员函数两种方式的区别、等知识点的掌握程度。话不多说下面我直接贴代码,如有纰漏望指正。
代码
#include<iostream>
#include<string.h>
using namespace std;
class String
{
friend ostream& operator<< (ostream&,String&);
friend istream& operator>> (istream&,String&);
public:
String();
String(const char* str);
String(const String &other);
String& operator=(String& other);
~String();
String& append(const char c);
private:
char *m_data;
};
String::String() //默认构造函数
{
cout<<"default construct"<<endl;
m_data = new char[1];
if(NULL != m_data)
{
*m_data = '\0';
}
}
String::String(const char *rstr) //构造函数
{
if(rstr == NULL)
{
m_data = new char[1];
*m_data = '0';
}
else
{
cout<<"const char construct"<<endl;
m_data = new char[strlen(rstr)+1];
if(NULL != m_data)
{
strcpy(m_data,rstr);
}
}
}
String::String(const String &other) //拷贝构造函数
{
//因为接受参数为String类的引用,而引用不为空,所以不做判空处理
cout<<"copy construct"<<endl;
m_data = new char[strlen(other.m_data)+1];
if(m_data)
{
strcpy(m_data,other.m_data);
}
}
istream& operator>>(istream& in, String& str)//重载输入流
{
char tmp[255];
int i = 0;
char c;
if(in.get(tmp,255))
{
str.m_data = new char[strlen(tmp)+1];
strcpy(str.m_data,tmp);
}
return in;
}
ostream& operator<<(ostream& out,String& str)//输出
{
out<<str.m_data;
return out;
}
String& String::operator=(String& other)//赋值
{
if(this != &other)
{
delete [] m_data;
m_data = new char[strlen(other.m_data)+1];
if(m_data)
{
strcpy(m_data,other.m_data);
}
}
return *this;
}
String& String::append(const char c) //追加
{
int len = strlen(m_data)+2;
char * buf = new char[len];
strcpy(buf,m_data);
buf[len-2] = c;
buf[len-1] = '\0';
if(m_data)
{
delete [] m_data;
}
m_data = new char[len];
if(m_data)
{
strcpy(m_data,buf);
}
return *this;
}
String::~String()//析构函数重载 成员含有指针时必须重载拷贝构造函数、析构函数、赋值函数。
{
if(m_data)
{
delete [] m_data;
}
}
int main()
{
String s1;
String s2("hell");
String s3;
// s3 = s2;
s2.append('o');
cout<<s1;
cout<<s2<<endl;
cin>>s3;
cout<<s3;
return 0;
}