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__
  • 相关阅读:
    LeetCode题目(python)
    解决:centos配置ssh免密码登录后仍要输入密码
    解决 find: 路径必须在表达式之前:
    --解决Lock wait timeout exceeded; try restarting transaction
    Linux文件删除,但是df之后磁盘空间没有释放
    定位class时空格注意
    解决jenkins的Console Output中文乱码
    CPU飙升问题排查
    JVM笔记
    List集合的使用
  • 原文地址:https://www.cnblogs.com/alan-W/p/14199802.html
Copyright © 2011-2022 走看看