几道笔试题

来源:互联网 发布:aⅴ淘宝m7视频 编辑:程序博客网 时间:2024/05/01 13:56
1   构造函数可不可以是虚函数,为什么? 
      不可以 虚函数的调用必须要有V_TABLE的支持,当在构造函数中的时候,对象还没有构造完成,是没有这个表的,所以无法调用虚函数。
有错误,是vptr没有被初始化
 
 2   析构函数可不可以是虚函数,为什么? 
      可以   虚析构函数
 3   构造函数没有返回值,怎么确定是否成功? 
      失败则抛出一个异常,或者使用一个内部状态位标识对象状态 
 4   析构函数内为什么不能抛出异常? 
      throw 会使栈被展开,因为在栈展开时,栈页面中的所有的局部对象会被析构,此时如果那些析构函数之一抛出异常,C++运行时系统会无法判断该如何处理。

      C++异常处理模型是为C++语言量身设计的,更进一步的说,它实际上也是为C++语言中面向对象而服务的,我们在前面的文章中多次不厌其烦的声明到,C++异常处理模型最大的特点和优势就是对C++中的面向对象提供了最强大的无缝支持。好的,既然如此!那么如果对象在运行期间出现了异常,C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域),并释放对象原来所分配的资源,这就是调用这些对象的析构函数来完成释放资源的任务,所以从这个意义上说,析构函数已经变成了异常处理的一部分。不知大家是否明白了这段话所蕴含的真正内在涵义没有,那就是上面的论述C++异常处理模型它其实是有一个前提假设——析构函数中是不应该再有异常抛出的。试想!如果对象出了异常,现在异常处理模块为了维护系统对象数据的一致性,避免资源泄漏,有责任释放这个对象的资源,调用对象的析构函数,可现在假如析构过程又再出现异常,那么请问由谁来保证这个对象的资源释放呢?而且这新出现的异常又由谁来处理呢?不要忘记前面的一个异常目前都还没有处理结束,因此这就陷入了一个矛盾之中,或者说无限的递归嵌套之中。所以C++标准就做出了这种假设,当然这种假设也是完全合理的,在对象的构造过程中,或许由于系统资源有限而致使对象需要的资源无法得到满足,从而导致异常的出现,但析构函数完全是可以做得到避免异常的发生,毕竟你是在释放资源呀!好比你在与公司续签合同的时候向公司申请加薪,也许公司由于种种其它原因而无法满足你的要求;但如果你主动申请不要薪水完全义务工作,公司能不乐意地答应你吗?

5   类的成员函数作回调函数需要什么条件? 
  关键就是不让this指针起作用 
  回调函数使用方法: 
  a.   直接使用普通C函数 
  b.   使用静态成员函数

参考 http://blog.csdn.net/tvtvtvtv/archive/2006/11/22/1404661.aspx
原创粉丝点击