• 题目描述:

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

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

     显然这道题考的是拷贝赋值运算符函数的定义,重点有几个:

    1. 拷贝赋值运算符函数的返回值类型是该类型的引用,并在函数结束前返回实例自身的引用(*this)。
    2. 拷贝赋值运算符函数传入的参数类型是该类型的常量引用
    3. 要释放实例原有的内存
    4. 要判断传入参数是否是当前实例本身,如果传入的是实力本身而又释放了实例的内存,就会导致严重错误。

    接下来就可以写这个函数了,有两种方法,方法一是我按照c++ primer中的方法写的,也就是先new分配一个新内容将原内容拷贝过去,再delete原内存。方法二是剑指offer上的,先创建一个临时的实例(类对象,用传入的参数初始化),然后交换临时实例和原实例(在函数结束后临时实例被释放)。

    • 方法一:
    CMyString& CMyString::operator==(const CMyString& str)
    { //成员char*是字符串数组,new和copy的方式很重要
    	char *newdata = new char[strlen(str) + 1];
    	strcpy(newdata,str.m_pData);
    	//新内存分配完成,再进行delete,这里先new后delete防止了内存不足报错而m_pDate已空的情况
    	delete []m_pData;
    	m_pDate = newdata;
    	return *this;
    }
    
    • 方法二:
    CMyString& CMyString::operator=(const CMyString& str)
    {
    	if(this != &str)
    	{
    		CMyString strTemp(str);
    		char* pTemp = strTemp.m_pData;
    		strTemp.m_pData = m_pData;
    		m_pData = pTemp;
    	}
    	return *this;
    }
    

    这一题考的是拷贝控制的内容,拷贝控制部分包括拷贝构造函数、拷贝赋值运算符、析构函数等等内容,有必要找时间进行总结。

 posted on 2017-04-24 17:03  Bill_LHR  阅读(365)  评论(0编辑  收藏  举报