zoukankan      html  css  js  c++  java
  • 侯捷《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__
  • 相关阅读:
    Clouds
    docs
    虚拟化监控问题
    Openstack Ceilometer监控项扩展
    openStack ceilometer API
    sql分级汇总
    【Android归纳】阿里笔试题之Android网络优化
    享元模式
    【Hibernate步步为营】--核心对象+持久对象全析(三)
    Linux经常使用命令(三)
  • 原文地址:https://www.cnblogs.com/alan-W/p/14199802.html
Copyright © 2011-2022 走看看