string类的实现(mystring)

来源:互联网 发布:php 网盘 程序 编辑:程序博客网 时间:2024/05/20 10:54

最近参加了实习招聘感觉自己的C++都快忘光了,其中面试过程中问到了string类的实现,需手写实现一遍。现在再实现一下

class mystring{    friend std::ostream& operator<<(std::ostream& os,const mystring & str);private :    char * m_data;public :    mystring(char * str=NULL);    ~mystring();    mystring & operator=(const mystring & a);    mystring(const mystring &a);    };inline mystring::mystring(char *str=NULL){    if (str!=NULL)    {        m_data = new char[strlen(str)+1];        strcpy(m_data,str);    }else    {        m_data=NULL;    }}inline mystring::~mystring(){    if (m_data!=NULL)    {        delete[] m_data;        m_data=NULL;    }}inline mystring::mystring(const mystring &a)//使用静态的防止被修改  传入引用是避免拷贝函数再调拷贝函数导致编译出错{    if (a.m_data!=NULL)    {        m_data = new char[strlen(a.m_data)+1];        strcpy(m_data,a.m_data);    }    else    {        m_data=NULL;    }}inline mystring & mystring::operator=(const mystring &a)//赋值运算符需要返回该类型的引用  这样才能连续赋值 {    if (a.m_data!=NULL)    {        if (m_data==NULL)        {            m_data = new char[strlen(a.m_data)+1];            strcpy(m_data,a.m_data);        }        else        {            if (this == &a)            {                return *this;            }            delete []m_data;            m_data = new char[strlen(a.m_data)+1];            strcpy(m_data,a.m_data);        }    }    else    {        delete []m_data;        m_data=NULL;    }    return *this;}std::ostream& operator<<(std::ostream& os,const mystring & str){    os<< str.m_data;    return os;}

提醒自己需要注意的几点:
1. 重载赋值运算符的时候,要考虑到是否为自身,即(this与&a)的比较
2. 重载赋值运算符的时候,要返回返回该类型的应用,这样就可以实现连续赋值
3. 拷贝构造函数参数需要是引用的,因为如果参数是实例,那么从形参到实参会调用一次辅助构造函数,形成无休止的调用,造成编译出错。
4. 还有没考虑到的就是new的时候可能会出现错误,所以在函数中可先实例一个对象,然后再交换。

0 0
原创粉丝点击