面试题1:赋值运算符函数

<strong>经典的初级解法:</strong>
#include<iostream>
using namespace std;

class cMyString {
private:
	char * m_pData;
	
public:
	cMyString(const char * pData) {
		if(pData == NULL) {
			m_pData = new char[strlen(pData) + 1];
			m_pData[0] = '\0';
		}
		else {
			m_pData = new char[strlen(pData) + 1];
			strcpy(m_pData, pData);
		}
	}
	
	cMyString::cMyString(const cMyString &str)
	{
		int length = strlen(str.m_pData);
		m_pData = new char[length + 1];
		strcpy(m_pData, str.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;
	}
	
	cMyString(void) {
		if(m_pData != NULL) {
			delete[] m_pData;
		}
	}
	
	void cMyString::print() {
		printf("%s\n", m_pData);
	}
};
int main() {
	cMyString S1("");
	
	cMyString S3("sssss");
	cMyString S2(S3);
	cMyString S4 = S1;
	
	S1.print();
	S2.print();
	S3.print();
	S4.print();
	
	return 0;
}


考虑异常安全性的解法:

       在上述方法中, 我们先delete掉了m_pData中的内容, 如果此时内存不足以new出要求长度的m_pData时抛出异常, m_pData将是一个空指针, 很容易导致程序崩溃。

	
	cMyString& cMyString::operator = (const cMyString &str) {
		if(this != &str) {
			cMyString strTemp(str);

			char* pTemp = strTemp.m_pData;  //swap(m_pData, pTemp);
			strTemp.m_pData = m_pData;
			m_pData = pTemp;
		}
		return *this;
	}
	
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值