侯捷《C++面向对象开发》--String类的实现

#ifndef __STRING__
#define __STRING__

#include<ostream>
class String
{
public:
    String(const char* cstr = 0);                   //构造函数
    String(const String& str);                      //拷贝构造
    String& operator = (const String& str);         //拷贝复制
    ~String();                                      //析构函数
    char* get_c_str() const { return m_data; }
private:
    char* m_data;
};

inline String::String(const char* cstr)               //这里不能重新定义默认参数,如果需要参数的其他值,则应将默认参数留空。
{
    if (cstr)                                         //检查cstr是否为空指针
    {
        m_data = new char[std::strlen(cstr) + 1];
        strcpy_s(m_data, (std::strlen(cstr)+1),cstr);
    }
    else
    {
        m_data = new char[1];
        *m_data = '';
    }
}

inline String::String(const String& str)
{
    if (str.m_data)
    {
        m_data = new char[strlen(str.m_data) + 1];                 //拷贝构造中,申请的内存空间为str.m_data的长度+1,(''的原因)
        strcpy_s(m_data, (std::strlen(str.m_data) + 1), str.m_data);//strcpy_s是比strcpy更安全的函数
    }
    else
    {
        m_data = new char[1];
        *m_data = '';
    }
}

inline String::~String() 
{
    delete[] m_data;
}

inline String& String::operator = (const String& str)
{
    if (this == &str)         //在拷贝复制时首先检查=左右的指针是否为同一指针。若指针相同,delete时会导致=两侧的指针同时被delete
    {
        return *this;
    }
    delete[] m_data;         //delete掉目标指针,避免内存泄露
    m_data = new char[strlen(str.m_data) + 1];
    strcpy_s(m_data, (std::strlen(str.m_data) + 1), str.m_data);
    return *this;
}

std::ostream& operator<< (std::ostream& os, const String& str)
{
    if (str.get_c_str())
        return os << str.get_c_str();
    else
        return os << "NULL";

}
#endif // !__STRING__
原文地址:https://www.cnblogs.com/alan-W/p/14199802.html