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

C++面试宝典

2017-07-11 22:52 316 查看
我有一个和有意思的朋友,他是一个很厉害的人。有一天,他问我敢不敢和他玩一个游戏,我当然说可以呀,毕竟我也不是一个怂人。这个游戏确实很有意思,一个模拟面试的游戏,我们可以互相的提问,关于面试的很多问题?下面这些问题是关于c++的,我把它们全部整理出来了。

1.问:函数重载和覆盖的区别?

答:①定义放面:

函数重载:在相同作用域下(如果有关键字const,那么他必须用来修饰指针或者引用),函数名相同,参数列表不同,不能仅依靠返回值。

覆盖:就是派生类和基类中函数名相同,并且参数列表页相同,返回值也相同。基类的同名函数必须是虚函数(被virtual修饰),派生类覆盖基类的同名函数。

②使用方面:函数重载多用于运算符的重载,而覆盖多用于继承。

③函数的确认:函数重载是在编译阶段确定需要调用那个函数,而覆盖是在运行的时候,才确定下来调用的是那个函数。

④函数是否相同:函数重载是生成的符号不同,而覆盖相同的函数。

相同方面:函数名都是必须相同的。

2.问:模板为什么不能分离编译?

答:该问题需要知道一点编译、链接的过程,这个我有一篇文章是关于编译、链接的。编译、链接小知识

我们都是c++中函数的模板很强大,一段代码,完成的类型很多的。

C++标准明确表示,当一个模板不被用到的时侯它就不该被实例化出来。如果模板函数和调用分别在不同.cpp文件里面,写函数的那个文件,在边界阶段由于没有接到什么指示说有人要用,所以就没有将它生成机器代码,可是那个调用的文件中,他要用呀!编译的时候,他寄希望于编译器,等到各个文件都被编译好,开始链接时,就出现了懒做现象,编译器只能报错了!

在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找(当遇到未决符号时它会寄希望于连接器)。这种模式在没有模板的情况下运行良好,但遇到模板时就傻眼了,因为模板仅在需要的时候才会实例化出来,所以,当编译器只看到模板的声明时,它不能实例化该模板,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。然而当实现该模板的.cpp文件中没有用到模板的实例时,编译器懒得去实例化,所以,整个工程的.obj中就找不到一行模板实例的二进制代码,于是连接器也黔驴技穷了。

3.问:虚函数内存如何分配?

答:1.单继承无虚函数覆盖:基类和派生类生成一张虚函数表,父类的虚函数按照顺序,依次填入虚函数表中,接着就是子类的虚函数,依次按照声明顺序填入虚函数表中。
2.单继承有虚函数覆盖:基类和派生类还是会生成一张虚函数表,显示基类按照声明,将虚函数填入虚函数表中。派生类看自己的虚函数有和基类构成覆盖的,就可以直接将该函数地址填到基类和该函数同名的位置。
3.多继承无虚函数覆盖:按照基类的声明顺序,依次将基类的虚函数地址填入虚函数表里面,再接着是派生类的虚函数地址,依次填入虚函数表中。
4.多继承有虚函数覆盖:按照基类的声明顺序,依次将基类的虚函数地址填入虚函数表里面,再接着是派生类的虚函数地址,如果该派生类中的函数在多个基类中都有一个覆盖函数,将所有基类中此函数位置的地址都写成派生类该函数的地址。
如果文字表述感觉不是很直观,我这里还有一篇博客是专门画图说明的。[有图的直观说明](http://blog.csdn.net/qq_35256722/article/details/74594394)


4.问:如何防止构造函数的隐士提升?

答:关键字explicit加在构造函数前面。

5.问:malloc底层是怎么实现

答:有个do_brk()是分配前128k。有一个内存库,free之后没有归还操作系统而是放在内存库里面。

do_mmap()是分配后128k的内存,free直接交换内存的。

malloc分配的物理内存不连续,虚拟地址是连续。

注: 这个不详细,准备将详细的再写一篇文章。

6.问:malloc内存申请有内存碎片,如何防止内存碎片?

答:内存碎片式由于要申请的连续空间比内存池中的空间大,就形成了内存碎片。


7.问:const修饰的成员函数内,是否能修改成员变量的值?

答:可以,const 修饰的是这个this指针,指针指向不能改,但是指针的内容可以改。结果和 int *const p 相同。

8.问:如果new[1] 那么可不可以直接delete,只有一个元素么?

答:new在申请1个字节大小的空间时,内存为了好管理,给他带了一个4个字节头和4个字节的尾巴。那么delete只是释放一个元素,那个头和尾巴没有被释放,造成了内存泄漏了。


9.问:空的vector求sizeof是多少?

答:32位下是12,64位下是24;说一下32位的吧!

这个得先说一下,vector发底层有3个指针:begin vector 、end vector 、vector capactiy。所以sizeof就是这三个指针的大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++