String类代码

来源:互联网 发布:windows latex 实时 编辑:程序博客网 时间:2024/06/09 14:37
#include <iostream>#include <string.h>#include <assert.h>using namespace std;class String {        public:                String(const char *str = NULL);   //这个地方经常会忽略掉const 和 =NULL                String(const String &other);                String &operator = (const String &other);                ~String(void);        private:                char *m_data;};String::String(const char *str){        if(str == NULL)        {                m_data = new char[1];                m_data[0] = '\0';        }        else        {                m_data = new char[strlen(str) + 1];                strcpy(m_data, str);        }}String::String(const String &other){        assert(other.m_data != NULL);        m_data = new char[strlen(other.m_data) + 1];        strcpy(m_data, other.m_data);}String & String::operator=(const String &other){        assert(other.m_data != NULL);        if(&other == this)   //这里很容易丢掉,而且注意不是other == *this,没有定义"=="操作符呢还                return *this;        delete m_data;        m_data = new char[strlen(other.m_data) + 1];        strcpy(m_data, other.m_data);        return *this;}String::~String(void){        delete m_data;}int main(){        return 0;}

 这里,对于一个string类,构造出来的m_data至少有一个'\0',而不是空指针,这样可以避免出现访问空指针的情况。也看见过为m_data为空的写法,感觉不如这样严谨。而且如果允许m_data为空,那么在析构函数析构,赋值函数delete m_data时都必须要检查下m_data是否为空指针。
还有拷贝构造函数的问题,当成员变量有指针的时候,一般要手写拷贝构造函数,否则会发生浅拷贝,这个时候,两个对象的指针成员会指向同一块内存空间,为了避免发生这种现象,就要手写拷贝构造函数。像String类的拷贝构造函数。

原创粉丝点击