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]=‘\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]=‘\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; }
时间: 2024-10-26 01:33:20