(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;
}
原文地址:https://www.cnblogs.com/AndyJee/p/4681941.html