您的位置:首页 > 编程语言 > C语言/C++

C++经典面试题(二)

2015-06-27 10:03 302 查看
最近看一些面试题,觉得如果自己被问到了,并不能很利落的回答出来。

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

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

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和指针》上看到的这句话。

未完。。。待续(*^_v_^*)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ c