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

C++经典面试题(四)

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

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

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

31.Heap与stack的差别

【参考答案】

Heap是堆,stack是栈。

Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。

Stack空间有限,Heap是很大的自由存储区

C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。

程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行

32.In C++, what does "explicit" mean? what does "protected" mean? 

【标准答案】

c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,在某些情况下,我们要求类的使用者必须显示调用类的构造函数时就需要使用explicit,反之默认类型转换可能会造成无法预期的问题。

protected控制的是一个函数对一个类的成员(包括成员变量及成员方法)的访问权限。protected成员只有该类的成员函数及其派生类的成员函数可以访问。

我擦!它俩为啥放在一起问。

33.重复多次fclose一个打开过一次的FILE *fp指针会有什么结果,并请解释。 

【参考答案】考察点:导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。 

34.为什么数组名作为参数,会改变数组的内容,而其它类型如int却不会改变变量的值?

【参考答案】当数组名作为参数时,传递的实际上是地址。而其他类型如int作为参数时,由于函数参数值实质上是实参的一份拷贝,被调函数内部对形参的改变并不影响实参的值。

传值与传地址的区别

35.你觉得如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦? 

【参考答案】

(1)  程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。 

(2)  在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。 

(3)  如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。

36.为什么需要使用堆,使用堆空间的原因?

【参考答案】直到运行时才知道一个对象需要多少内存空间;不知道对象的生存期到底有多长。

因为需要动态分配内存啊。。。

37. const关键字?有哪些作用

【参考答案】const关键字至少有下列n个作用:

(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;

(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;

(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;

(这样既可以利用传地址、传引用的高效特性,又保证了传值的安全性)

(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;

还记得如果要修改成员变量,应该把成员变量声明为什么吗?mutable!

(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

更多更详细的内容,推荐看《Effective C++》

38.、是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?

【参考答案】virtual修饰符会被隐形继承的。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual ,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。

不过最好是加上,加上表明它是一个虚函数,这样提高了代码的阅读性。

39.面向对象的三个基本特征,并简单叙述之?

【参考答案】                                                                     

1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public)                
 

2. 继承:广义的继承有三种实现形式:

实现继承(指使用基类的属性和方法而无需额外编码的能力)、

可视继承(子窗体使用父窗体的外观和实现代码)、

接口继承(仅使用属性和方法,实现滞后到子类实现)。

前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。                                 3. 多态:是将父对象设置成为和一个或更多的与他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

40.重载(overload)、重写(override,有的书也叫做“覆盖”)、重定义(redefinition)的区别?

【标准答案】



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