class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
private:
char* m_pData;
};
//赋值构造函数
CMyString& CMyString::operator = (const CMyString& str)
{
if(this != &str)
{
//释放实例自身的内存,否则出现内存泄露
/*if(m_pData != NULL)
{
delete[] m_pData;
m_pData = NULL;
}
//新分配内存,将str的m_pData内存拷贝到m_pData中
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);*/
//在这个函数中,我们定义一个临时实例strTemp,并把strTemp的m_pData指向当前实例(*this)的m_pData。
//由于strTemp是个局部变量,但程序员运行到if的外面是也就出了的该变量的域,就会自动调用strTemp的析构函数,
//就会把strTemp.m_pData所指向的内存释放掉。由于strTemp.m_pData指向的内存就是当前实例之前m_pData的内存。
//这就相当于自动调用析构函数释放当前实例的内存。如果新增加指针成员变量,
//我们只需要在析构函数里正确地释放,而不需要对赋值运算符函数做任何修改。
CMyString tempStr(str);
char* temp = tempStr.m_pData;
tempStr.m_pData = m_pData;
m_pData = temp;
}
return *this;
}
//拷贝构造函数
CMyString::CMyString(const CMyString& str)
{
m_pData = new char[strlen(str.m_pData) +1];
strcpy(m_pData, str.m_pData);
//memcpy(m_pData, str.m_pData, strlen(str.m_pData));
}
CMyString::~CMyString(void)
{
if(m_pData != NULL)
{
delete[] m_pData;
m_pData = NULL;
}
}