《剑指Offer》 面试题一:类对象赋值运算符函数重载

手敲实现了一下书中的CMyString类,发现有几个需要注意的点:

  1. 要注意指针参数可能为空,即空指针的情况,其在实际运行时会引发异常
  2. cout不能输出空指针指向的内容,strcpy的参数必须是非空指针,否则会有异常
  3. 在赋值运算符重载时,应该注意:形参类型是常引用;返回值应为对象的引用,以保证“=”可以连等的写法(这个类似于<<与iostream的实现);在new新的空间写新内容之前,需要先将之前的内存delete;同时要特判"t=t"的情况,防止将自身delete.

代码如下:

#include <iostream>

using  namespace std;

class Cstring {
private:
	char* m_str;  //m_str有指向自身实例独有的字符串存放内存
public:
	Cstring(char* p = NULL);
	Cstring(const Cstring& str);
	~Cstring(void);
	Cstring& operator = (const Cstring& str);
	void print() {
		if(m_str!=NULL)
		cout << "Str:\t" << m_str << endl;
	}
};

Cstring::Cstring(char* p)
{
	if (p == NULL)
	{
		m_str = NULL;
		return;	
	}
	m_str = new char[strlen(p)];	//对一个空指针NULL strlen会引发异常
	if (m_str != NULL)
		strcpy(m_str, p);
}

//深复制  此处不能是浅复制,否则指向同一块内存,另一对象的析构产生“野指针”
Cstring::Cstring(const Cstring& str)
{
	unsigned int i = strlen(str.m_str);
	m_str = new char[i];
	if (m_str != NULL)
		strcpy(m_str, str.m_str);
}

Cstring::~Cstring(void)
{
	delete[] m_str;
	m_str = NULL;	//指针需要赋空
}

Cstring& Cstring:: operator = (const Cstring& str)
{
	if (&str == this)
		return *this;
	delete[] m_str;
	m_str = NULL;
	m_str = new char[strlen(str.m_str)];
	if (m_str != NULL)
		strcpy(m_str, str.m_str);
	return *this;
}


int main()
{
	char p[] = "myFirstStirngClass";
	Cstring str1(p);
	Cstring str2 = str1;
	Cstring str3;
	str1.print();
	str2.print();
	str3.print();
	str3 = str2 = str1;
	str1.print();
	str2.print();
	str3.print();


	//while (1) getchar();
	return 0;
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值