zoukankan      html  css  js  c++  java
  • 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
    } 
    复制代码

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

  • 相关阅读:
    堆优化Dijkstra模版
    poj_1364King
    快速排序库函数qsort的使用
    CMD type命令
    开放地址法
    poj_3159Candies
    poj_1511Invitation Cards
    何谓数据结构
    div ul li添加文本自动自动
    java虚拟机使用内存
  • 原文地址:https://www.cnblogs.com/yechanglv/p/6931004.html
Copyright © 2011-2022 走看看