c++中string 的实现

来源:互联网 发布:源码资本投资的项目 编辑:程序博客网 时间:2024/06/02 05:50

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;}
原创粉丝点击