• C++类设计2(Class with pointer members)


    二 Class with pointer members(Class String)

    1. 测试代码(使用效果)

    复制代码
    int main()
    {
        String s1(),
        String s2("hello");          //构造函数
        String s3(s1);               //拷贝构造
        cout << s3 << endl;
        s3 = s2;                     //拷贝赋值
        cout << s3 << endl;
    }
    复制代码

    2 Big three(三种特殊函数)

    复制代码
    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; 
    };
    复制代码

    2.1 ctor & dtor(构造与析构)

    复制代码
    inline
    String::String(const char* cstr = 0)
    {
        if(cstr){
            m_data = new char[strlen(cstr)+1];
            strcpy(m_data,cstr); 
        }
        else{   //未指定长度 
            m_data = new char[1];
            *m_data = '';
        }
    }
    
    inline
    String::~String()
    {
        delete[] m_data;
    } 
    复制代码

    2.2 Class with pointer members必须有copy ctor(拷贝构造)和copy op(拷贝赋值)

    深拷贝与浅拷贝

    深拷贝:

    inline
    String::String(const String& str){
        m_data = new char[strlen(str.m_data) + 1];  //直接取得另一个对象的private数据
                                                    //可用友元解释 
        strcpy(m_data, str.m_data);
    }

    拷贝赋值函数:

    思路:若右边拷贝到左边,步骤为 清空左边;分配与右边相同空间;完成拷贝。

    复制代码
    inline
    String& String::operator=(const String& str){
        if(this == &str){  //检测自我赋值,不仅仅是效率问题 
            return *this;  // 如果不检验的话,可能造成行为未定义,见下图解释
        }
        delete[] m_data;    // 清除左边 
        m_data = new char[ strlen(str.m_data) + 1];//开辟空间 
        strcpy(m_data, str.m_data); //完成拷贝 
        return *this
    } 
    复制代码

    总结:有指针变量的类,一定要重新其拷贝构造,拷贝赋值和析构函数!

  • 相关阅读:
    Android 模拟系统事件(三)
    全民Scheme(2):来自星星的你
    Java经典23种设计模式之行为型模式(三)
    libmysqld,嵌入式MySQLserver库
    闲云控制台(一)控制台命令解析框架
    怎样改动android系统字体大小
    [多校2015.02.1006 高斯消元] hdu 5305 Friends
    换工作经历和心得
    安卓实训第七天---多线程下载实现(进度条)
    校园双选会,你都懂么
  • 原文地址:https://www.cnblogs.com/yechanglv/p/6931004.html
Copyright © 2020-2023  润新知