c++面试题

来源:互联网 发布:网络上赌博害了多少人 编辑:程序博客网 时间:2024/06/05 09:11
1.C++内存管理


2. Malloc free 与 New Delete的区别


3. 构造函数能否抛出异常 析构函数能否抛出异常?


4. C++ 类型转换有哪几种,子类转换父类使用哪种?


5. C++ 函数重载的定义?哪几种情况属于重载?函数名和形参相同,返回值不同属不属于重载?


6.  C++ 要使用C函数要怎么做?为什么要这么做?


7. 进程和线程的区别和联系?


8.  C++在什么情况下会产生临时对象?


9. 常用的设计模式? 工厂和抽象工厂模式区别?策略模式的解释?


答案


1. C++ 内存管理


 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。


  栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。


  堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。


  自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。


  全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。


  常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。


2.  Malloc free 与 New Delete的区别
1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 
3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。


5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针
3. 构造函数能否抛出异常 析构函数能否抛出异常?
构造函数可以抛出异常。
C++标准指明析构函数不能、也不应该抛出异常。


more effective c++提出两点理由(析构函数不能抛出异常的理由):


1)如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。


2)通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。


4. C++ 类型转换有哪几种,子类转换父类使用哪种?


C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。


  const_cast,字面上理解就是去const属性。


  static_cast,命名上理解是静态类型转换。如int转换成char。


  dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。


  reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换。


  总 结


  去const属性用const_cast。


  基本类型转换用static_cast。


  多态类之间的类型转换用daynamic_cast。


  不同类型的指针类型转换用reinterpreter_cast。
http://hb.qq.com/a/20110722/001452.htm


5. C++ 函数重载的定义?哪几种情况属于重载?函数名和形参相同,返回值不同属不属于重载?


http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html


6.  C++ 要使用C函数要怎么做?为什么要这么做?


http://blog.csdn.net/devil_2009/article/details/6734760


7.进程和线程的区别和联系?


http://blog.csdn.net/pyjfoot/article/details/7389389


8.  C++在什么情况下会产生临时对象?


http://www.cnblogs.com/daocaoren/archive/2011/07/19/2110258.html


9. http://hb.qq.com/a/20110722/001452.htm

转自:http://blog.csdn.net/mixcodingstyle/article/details/20006031

0 0
原创粉丝点击