zoukankan      html  css  js  c++  java
  • (C++)已知String类的定义,实现其函数体

    CString类的定义如下:

    class CMyString{
    public:
        CMyString(const char* pData=NULL);
        CMyString(const CMyString& str);
        CMyString& operator=(const CMyString& str);
        char* getData(){return this->m_pdata;};
        ~CMyString(void);
    
    private:
        char *m_pdata;
    };
    

    1、实现其构造函数

    通用构造函数

    复制构造函数

    有两种方式,一种是浅拷贝,一种是深拷贝,浅拷贝就是指向已经存在的内存地址,深拷贝就是分配新空间,将数据复制过来。

    浅拷贝代码:

    // shallow copy
    CMyString::CMyString(char* pData){
        m_pdata=pData;
    }
    
    CMyString::CMyString(const CMyString& str){
        *this=str;
    }

    深拷贝代码:

    CMyString::CMyString(const char* str){
        if(str==NULL){
            m_pdata=new char[1];
            m_pdata[0]='';
        }
        else{
            m_pdata=new char[strlen(str)+1];
            strcpy(m_pdata,str);
        }
    }
    
    CMyString::CMyString(const CMyString &str){
        m_pdata=new char[strlen(str.m_pdata)+1];
        strcpy(m_pdata,str.m_pdata);
    }

    2、析构函数

    CMyString::~CMyString(){
        delete[] m_pdata;
    }

    3、赋值运算符函数

    赋值运算符和复制构造函数的区别:

    a. 复制构造函数生成新类对象,而赋值运算符不能,赋值运算符是用已存在的对象来创建另一个对象,给对象赋予一个新的值;

    b. 由于复制构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检查源对象是否和新对象相同。而赋值运算符需要这个操作,另外赋值运算符中如果原来的对象有内存分配,要先把内存释放掉,避免内存泄露。

    c. 当类中有指针类型的成员变量时,一定要重写复制构造函数和赋值运算符函数,不能使用默认的。

    CMyString& CMyString::operator=(const CMyString &str){
        if(this==&str)
            return *this;
        delete []m_pdata;
        m_pdata=NULL;
        m_pdata=new char[strlen(str.m_pdata)+1];
        strcpy(m_pdata,str.m_pdata);
        return *this;
    }

    4、总的代码

    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    class CMyString{
    public:
        CMyString(const char* pData=NULL);
        CMyString(const CMyString& str);
        CMyString& operator=(const CMyString& str);
        char* getData(){return this->m_pdata;};
        ~CMyString(void);
    
    private:
        char *m_pdata;
    };
    
    
    /*
    // shallow copy
    CMyString::CMyString(char* pData){
        m_pdata=pData;
    }
    
    CMyString::CMyString(const CMyString& str){
        *this=str;
    }
    */
    
    // deep copy
    CMyString::CMyString(const char* str){
        if(str==NULL){
            m_pdata=new char[1];
            m_pdata[0]='';
        }
        else{
            m_pdata=new char[strlen(str)+1];
            strcpy(m_pdata,str);
        }
    }
    
    CMyString::CMyString(const CMyString &str){
        m_pdata=new char[strlen(str.m_pdata)+1];
        strcpy(m_pdata,str.m_pdata);
    }
    
    CMyString::~CMyString(){
        delete[] m_pdata;
    }
    
    CMyString& CMyString::operator=(const CMyString &str){
        if(this==&str)
            return *this;
        delete []m_pdata;
        m_pdata=NULL;
        m_pdata=new char[strlen(str.m_pdata)+1];
        strcpy(m_pdata,str.m_pdata);
        return *this;
    }
    
    int main()
    {
        char a[]="hello";
        CMyString str(a);
        CMyString str1(str);
        CMyString str2;
        CMyString str3;
        str3=str2=str;
        cout << str.getData()<< endl;
        cout << str1.getData()<< endl;
        cout << str2.getData()<< endl;
        cout << str3.getData()<< endl;
        return 0;
    }
  • 相关阅读:
    匿名对象
    封装性
    1 Django初探
    8 定制10MINs 3
    7 定制10MINs首页2
    5-1 练习css 总结
    6.定制10MINS首页1
    3-1 练习 HTML 总结
    5. css定位 居中
    4 CSS的20/80个知识点
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4681941.html
Copyright © 2011-2022 走看看