剑指offer 二

第二部分:基础知识。

编程语言:通常语言面试有三种类型。

 

          第一种类型:对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;这里 = 是重载的。这样为什么就可以解决上述问题?

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值