题目:

如下为类型CMyString的声明,请为该类型添加赋值运算符函数

class CMyString
{
public:
    CMyString(char *pData=NULL);
    CMyString(const CMyString & str);
    ~CMyString(void);
 
private:
    char * m_pData;
};

 

 

代码及解题思路

#include "iostream"
#include "cstring"


using namespace std;

class CMyString
{
	public:
		CMyString(const char* pData = nullptr);
		CMyString(const CMyString& STR);
		~CMyString(void);

		char* getString(void);	//过去字符串值

		CMyString& operator=(const CMyString &str);	//重载 '='

	private:
		char* m_pData;
};

//问题:为类CMyString添加赋值运算符函数
//分析:使用operator对运算符'='进行重载,实现对象赋值

//#define WANGJIANFENG
#ifdef WANGJIANFENG
//方法1 常规解法
//要点:1.该方法必须返回对实例的引用 ,实现连续赋值str1 = str2 = str3
//	2.传入的参数声明为常量引用 const &,避免资源消耗
//	3.分配新的空间时,不忘释放之前的内存空间,避免内存泄漏
//	4.如果是对自身进行赋值,直接返回就好
CMyString& CMyString::operator=(const CMyString &str)
{
	if(this == &str)
	{
		return *this;
	}
	delete [] m_pData;	// 1.释放之前的内存
	m_pData = nullptr;

	m_pData = new char[(strlen(str.m_pData) + 1)];	// 2.分配内存空间
	strcpy(m_pData, str.m_pData);		// 3.传递值

	return *this;
}
#else
//方法2 进一步考虑异常安全性的解法  
//	避免"内存不足 -> new char异常 -> m_pData野指针 -> 程序崩溃"
//要点:1.创建一个临时对象 strTemp,(在构建函数中new对象)
//	2.临时对象和原来的对象进行交换
//	3.由于临时变量,函数结束系统自动执行strTemp的析构函数。销毁内存
CMyString& CMyString::operator=(const CMyString &str)
{
	if (this != &str)
	{
		CMyString strTemp(str);//创建中间对象 值为str.m_pData
		
		//使用临时变量,实现变量与对象的值的交换
		char* pTemp = strTemp.m_pData;
		strTemp.m_pData = m_pData;
		m_pData = pTemp;
	}
	return *this;
}

#endif

CMyString::CMyString(const char* pData)
{//构造函数1
	if (nullptr == pData)
	{//未传递值,给默认值0
		m_pData = new char[1];
		m_pData[0] = '\0';
	}
	else
	{
		m_pData = new char[strlen(pData) + 1];
		strcpy(m_pData,pData);
	}
}

CMyString::CMyString(const CMyString& STR)
{//构造函数2
	m_pData = new char[strlen(STR.m_pData) + 1];
	strcpy(m_pData,STR.m_pData);

}

CMyString::~CMyString(void)
{//析构函数
	delete [] m_pData;	//释放空间
}

char* CMyString::getString(void)
{
	return this->m_pData;
}

int main(void)
{
	CMyString str1("hello zhangsan");
	CMyString str2("hello lisi");
	CMyString str3("hello wangwu");
	str1 = str2;
	str2 = str3;

	cout << str1.getString() << endl;
	cout << str2.getString() << endl;
	return 0;
}

 

我的码云:https://gitee.com/hinzer/sword_to_offer/blob/master/quiestions/question_01.cpp