重写string 类的构造函数和析构函数

来源:互联网 发布:排版印刷软件 编辑:程序博客网 时间:2024/06/07 03:52

#include <iostream>
#include <assert.h>
#include <string.h>
using namespace std;

class String
{
public:
    String(const char * tmp = NULL);         //构造函数
    String(const String &object);     //拷贝构造函数
    String &operator = (const String &object); //赋值函数
    ~String();
private:
    char * m_str;
};

String::String(const char *tmp)
{
    m_str = NULL;
    if ( NULL == tmp )
    {
        m_str = new char[1];
        assert ( m_str != NULL );              //检测分配是否成功
        memset(m_str,0,sizeof(char)*1);
        *m_str = '/0';
    }
    else
    {
        int length = strlen(tmp) + 1;        //多分配一个空间,用于结束符
        m_str = new char[sizeof(char)*length];
        assert ( m_str != NULL );
        memset(m_str,0,sizeof(char)*length);
        strcpy(m_str,tmp);
    }
}

String::String(const String &object)
{
    m_str = NULL;

    int length = strlen(object.m_str)+1;
    m_str = new char[length];
    assert ( m_str != NULL );
    memset(m_str,0,sizeof(char)*length);

    strcpy(m_str,object.m_str);
}

String & String::operator = (const String & object)
{
    if (this == &object )   //此处用指针判断
    {
        return * this;
    }
    if ( m_str != NULL)
    {
        delete []m_str;
        m_str = NULL;
    }
    int length = strlen(object.m_str)+1;
    m_str = new char[length];
    assert ( m_str != NULL );
    memset(m_str,0,sizeof(char)*length);
    strcpy(m_str,object.m_str);
    return * this;    //拷贝完后返回自身,注意是*,因为是引用
}

String::~String()
{
    if (m_str != NULL )
    {
        delete []m_str;
        m_str = NULL;
    }
}

原创粉丝点击