类的构造函数、析构函数与赋值函数示例

今天上网无意中看到一个大牛写的文档,《高质量C/C++编程指南(林锐)》,看了一些,发现果然精彩,特别结合这一段时间的实习生笔试和面试,很多问题在这篇文档里讲到了,譬如昨天到浙江大华技术去笔试时,就碰到了这样一个题目,一个类如下:

class CString
{
public:
CString(const char *str = NULL);//普通构造函数
CString(const CString &other);//拷贝构造函数
~CString(void);//析构函数
CString & operator =(const CString &other);//赋值函数
private:
char *m_data; 
};

要求完成这些函数,当时做的时候,想当然,觉得很简单,就随便写了一下,根本没有想到一些基本的细节,后来看了林锐这篇文档,才知道自己的水平有多么差劲,就在我编写这段程序,收到了大华股份的辞谢信,再次被pass掉了,顺便提一下,当时面试大华的时候,为实习时间和面试官纠结了许久,我说周一到周五最多实习2天,他说至少3天,就这样僵持了几分钟,估计后来面试官看我也没什么时间时间,就问了我一个“技术问题”:写过函数模板没?我说,没有,但是我知道函数模板的应用,譬如STL。就这样,后来又谈了些无关紧要的话,面试就结束了,当时就感觉没多大希望了。

下面贴出今天下午写的一个较为完整的代码:

#include <iostream>
#include <string.h>
using namespace std;

class CString
{
	public:
		CString(const char *str = NULL);//普通构造函数
		CString(const CString &other);//拷贝构造函数
		~CString(void);//析构函数
		CString & operator =(const CString &other);//赋值函数
		void print(void);//打印字符串函数 
	private:
		char *m_data;	 
};

CString::CString(const char *str)
{
	if(str == NULL){
		m_data = new char[1];
		*m_data = '\0';
	}
	else{
		int length = strlen(str);
		m_data = new char[length+1];
		strcpy(m_data,str);
	}
}

CString::~CString(void)
{
	delete [] m_data;
}

CString::CString(const CString &other)
{
	int length = strlen(other.m_data);
	m_data = new char[length+1];
	strcpy(m_data,other.m_data);
}

CString & CString::operator =(const CString &other)
{
	//other无需与NULL比较,因为引用不可能是NULL 
	//检查是否自赋值
	if(this == &other) {
		return *this;
	}
	
	//释放原有的内存资源
	delete [] m_data;
	
	//分配新的内存,并复制内容
	int length = strlen(other.m_data);
	m_data = new char[length+1];
	strcpy(m_data,other.m_data);
	
	//返回本对象的引用
	return *this; 
}

void CString::print(void)
{
	cout << m_data << endl;
}

int main()
{
	cout <<"无参构造函数初始化" <<endl; 
	CString *pCStr1 = new CString;
	pCStr1->print();
	cout <<"普通构造函数初始化" <<endl; 
	CString str2("abcdef");
	str2.print();
	cout <<"拷贝构造函数初始化" <<endl; 
	CString str3(str2);
	str3.print();
	cout <<"赋值函数" <<endl; 
	CString str4 = str2;
	str4.print();
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值