C++经典面试题

最近看一些面试题,觉得如果自己被问到了,并不能很利落的回答出来。

一是从来没有这个意识,二是没有认真的梳理下。

下面对这些题做出分析,哈!个人能力有限,其中难免有疏漏,欢迎大家补充咯!


11.引用与指针有什么区别?
【参考答案】  
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。 
3) 不存在指向空值的引用,但是存在指向空值的指针。


可以参考下 在 5 题中补充的内容




12.C++中virtual与inline的含义分别是什么?
【参考答案】
在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。
inline与函数的定义体放在一起,使该函数称为内联。
inline是一种用于实现的关键字,而不是用于声明的关键字。 
虚函数的特点;如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。 
内联函数的特点;使用内联函数的目的是为了提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数的时间是以代码膨胀为代价的。内联函数不能包含循环语句,因为执行循环语句要比调用函数的开销大。


哈!我想我确实要注意一下表达能力。。




13.
VC中,编译工具条内的Debug与Release选项是什么含义?
【参考答案】
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。


Debug带有大量的调试代码,运行时需要相应的运行库,
发布模式程序紧凑不含有调试代码和信息,直接可以运行(如果不需要运行库)




14.函数assert的用法?
【参考答案】断言assert是仅在debug版本起作用的宏,用于检查“不应该“发生的情况。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段


学VC++的时候见过assert宏定义,但是自己从来没用过。。。




15.const  与 #define 的比较 ,const有什么优点?
【参考答案】
(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。 
#define不能生成 类的专属常量,因为它只是进行简单的替换。。
(2)  有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。


《Effective C++》中建议以const、enum、inline代替#define。
使用enum的原因
有些情况下,编译器不允许静态常量出现在类的初始设定中,只得以enum的形式
另一方面,enum和#define更相似,它们都没有具体的类型,比如,有const int a; 却没有 #define N int a,enum和#define都不能够被去地址,而const可以。




16.请你谈谈引用和指针的区别。
【参考答案】
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化) 。 
(2)不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL) 。 
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象) 。


不断地出现,可见这个问题是经常容易被问到的。




17.
有了 malloc/free 为什么还要 new/delete  ?
【参考答案】
malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可用于申请动态内存和释放内存。
 对于非内部数据类型的对象而言,光用 malloc/free 无法满足动态对象的要求。
对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free。 
因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。注意 new/delete 不是库函数。


以前只是习惯在用C时用malloc/free,用C++时用new/delete,没注意到这些差异性。




18.如果在申请动态内存时找不到足够大的内存块,malloc 和 new 将返回 NULL 指针,宣告内存申请失败。你是怎么处理内存耗尽的?
【参考答案】
(1)判断指针是否为 NULL,如果是则马上用 return 语句终止本函数。
(2)判断指针是否为 NULL,如果是则马上用 exit(1)终止整个程序的运行 
(3)为 new 和 malloc 设置异常处理函数。例如 Visual C++可以用_set_new_hander 函数为 new 设置用户自己定义的异常处理函数,也可以让 malloc 享用与 new 相同的异常处理函数。


我一般是直接return 了




19.C++是不是类型安全的?
【参考答案】不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。




20. const 符号常量;
(1)const char *p 
(2)char const *p (
3)char * const p 
说明上面三种描述的区别;
【参考答案】
(1)p是一个指向const char的指针,p是可以改变指向的,但是p指向的值是不能改变的;        
(2)p指向的恰好是一个指向const的char的普通指针;
(3)p是一个指针,这个指针是指向char的const指针。        
(1)和(2)的定义是一样的。


1、2和3的区别在于,1和2的const出现在*号左边,3出现在*号右边。好像也是在《C和指针》上看到的这句话。


猜你喜欢

转载自blog.csdn.net/qq_41848006/article/details/80381831