前段时间,S2的徐*同学去了一家作核能的企业做软件测试,在应聘的时候出了这样一道题目。
写出string类的构造函数,拷贝构造函数,析构函数,赋值函数。
这道题目是一道相当经典的C++开发题目,是面试C++程序员时经常考的,但这次无奈徐*碰上了,为什么呢?因为徐* 入职后作的是白盒测试。
#include<iostream>
using namespace std;
class String
{
public:
String(const char *str=NULL);
String(const String &other);
~String(void);
String &operator =(const String &other);
private:
char *m_data;
};
String::String(const char *str)
{
cout<<"构造函数被调用了"<<endl;
if(str==NULL)//避免出现野指针,如String b;如果没有这句话,就会出现野
//指针
{
m_data=new char[1];
*m_data=''/0'';
}
else
{
int length=strlen(str);
m_data=new char[length+1];
strcpy(m_data,str);
}
}
String::~String(void)
{
delete m_data;
cout<<"析构函数被调用了"<<endl;
}
String::String(const String &other)
{
cout<<"赋值构造函被调用了"<<endl;
int length=strlen(other.m_data);
m_data=new char[length+1];
strcpy(m_data,other.m_data);
}
String &String::operator=(const String &other)
{
cout<<"赋值函数被调用了"<<endl;
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 main()
{
String b;//调用构造函数
String a("Hello");//调用构造函数
String c("World");//调用构造函数
String d=a;//调用赋值构造函数,因为是在d对象建立的过程中用a来初始化
d=c;//调用重载后的赋值函数
}
这个题目因为类中有指针变量,使得在建立对象和析构对象的过程中涉及到深拷贝和浅拷贝的问题,还涉及到如何避免内存泄漏的问题。
感觉这道题目,充分考察了C++的一些基本功。学习C++最好的办法,就是找些经典的例题,然后对照编译器来进行学习,肯定会事半功倍的。
这道题目已调试通过,可直接运行。
文章出处:http://www.diybl.com/course/3_program/c++/cppsl/20071218/92698.html
FROM: http://blog.youkuaiyun.com/shiwei0124/article/details/4417831