第二部分:基础知识。
编程语言:通常语言面试有三种类型。
第一种类型:对c++关键字的理解程度。
第二种类型:根据事先准备好的代码,分析代码的运行结果。要求对c++考点有透彻的理解。即使对考点有一点点模糊,最终结果和实际运行的结果。
第三种类型:要求应聘者写代码定义一个类型或者实现类型中的成员函数。很多考查c++语法的代码题围绕在构造函数、析构函数、运算符重载。
题1:赋值运算符函数
赋值运算符函数:。。。。这个知识点不懂。
这里的赋值运算符函数应该是运算符的重载吧。。参考
1、http://wenku.baidu.com/view/e756ae63f5335a8102d2207b.html
2、http://news.newhua.com/news/2011/0718/127586.shtml
当需要为同一个类的两个对象相互赋值时,会有问题(??什么问题)。
/
总起来说就是析构函数造成的类的赋值和指针的释放问题。下面例子:
首先给出了一个新的Date类,其中一个字符串指针 *month,用来表示月份。
class Date
{
int mo,da,yr;
char *month;
public:
Date(int m=0,int d=0,int y=0);///构造函数
~Date();//析构函数
void display() const;///const???什么用处
};
Date::Date(int m, int d,int y)
{
static char *mos[]={january,february,march,april,may,june,july,august};
mo=m;da=d;yr=y;
if(m!=0)
{
month=new char[strlen(mos[m-1])+1];///为month申请内存,大小计算准确。下标从0到m-1,加1是最后的结束符。。。
strcpy(month,mos[m-1]);将mos值赋给month.strcpy(char *dst,const char *src)把从src地址开始且含有NULL结束符的字符串复制到以dst开始的地址空间。
}
else month=0;
}
Date::~Date()
{
delete []month;删除内存。。
}
void Date::display() const
{
if(month!=0) cout<<month<<<<da<<yr;
}
int main()
{
Date birthday(8,11,1979);
birthday.display();
return 0;
}
在Date对象的构造函数中,首先用new运算符为字符串month动态分配了内存,然后从内部数组中把月份的名字拷贝给字符串指针month。但是析构函数在删除month指针时,可能会出现一些问题,虽然从这个程序本身看,并没什么问题。但是当Date类用于赋值时,就会出现问题。假设有以下需求:
int main()
{
Date birthday(8,11,1979);
Date today;
today=birthday;
birthday.display();
return 0;
}
在这种情况下,会生成名为today的空的Date型变量,并且把birthday值赋给它。如果不特别通知编译器,它会简单的认为类的赋值就是成员对成员的拷贝,(?实际上是什么??)。并且变量birthday有一个字符型的指针month,且在构造函数里用new运算符初始化。当birthday离开其作用域时,析构函数会调用delete运算符来释放内存。但同时当today离开他的作用域时,析构函数同样会对它进行释放操作,然而问题是,today里的month指针是birthday里的month指针的一个拷贝,也就是说在上面析构函数对同一指针进行了两次删除操作。。。
所以,现在来看这个问题就是指针的释放问题。考虑的主要方向也是如何完成赋值同时可以保证指针删除只有一次。
/
为了解决这个问题,写一个特殊的赋值运算符函数来处理。这个方法可以解决类的赋值和指针的释放。
类中的赋值函数用new运算符从堆中分配了一个不同的指针,该指针获取赋值对象中相应的值,然后拷贝给接受赋值的对象。
month=new char[strlen(mos[m-1])+1];
strcpy(month,mos[m-1]);
类中重载赋值运算符的格式为:void operator =(const Date &);重载的运算符函数的返回类型为void。他是Date类的成员函数。他的函数名始终是operator=,参数也始终是同一个类的对象的引用。参数表示的是源对象,即赋值数据的提供者,重载函数的运算符作为目标对象的成员函数来使用。
Date birthday(8,11,1979);
Date today;
today=birthday;这里 = 是重载的。这样为什么就可以解决上述问题?