今天上网无意中看到一个大牛写的文档,《高质量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;
}