记一次面试经历

时间:2021-08-20 20:25:01

在大概5,6天前经历的一次面试,当时把问题记下来了,后来这几天有腾讯的一个竞赛,就一直没有整理,结果这竞赛把我虐的一愣一愣的,脑细胞都死完了,晚上还是整理一下面试题,恢复一下脑细胞。。这次面试让我知道了我这条鱼到底是有多咸,也知道了C++到底是有多么的博大精深。。

问题一:

.C++为什么要定义虚析构函数,多态性是如何实现的?(这个问题其实挺基础的,c++面试必问的)

答:c++多态分编译时多态和运行时多态,编译时多态指函数重载和泛型编程,运行时多态指的是虚函数。

主要讲一下虚函数,在函数前面加上virtual就是虚函数。在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。(有一句话说的很好,忘了在哪看得了)没有加virtual的话,对象按声明的类型调用函数,加virtual的话对象按实际类型调用函数。

(C++虚函数底层实现推荐看C++反汇编揭秘这本书)当类中定义有虚函数时,编译器会将该类中所有虚函数地址保存在一张表中,这张表被称为虚函数地址表(虚表)。同时,编译器还会在类中添加一个隐藏的数据成员,成为虚表指针。该指针保存着虚表的首地址,用来记录和查找虚函数。只要类中有虚函数,就一定有虚表存在,并且如果有子类继承,就算子类中没有虚函数,子类也会有虚表。如果子类继承多个父类,并且多个父类都有自己的虚函数,那么子类中会有一个虚表指针数组,包含每个父类的虚表指针。

 问题二:

 

举一个自己遇到的处理c++内存(泄露)方面的经历

答:没有。。。。(很尴尬,因为不知道到底要问什么,并且确实没有相关经验。。)

不过后来上网搜了搜,发现了一个帖子很详细很完整(可惜现在才发现)https://www.cnblogs.com/findumars/p/5929831.html?utm_source=itdadao&utm_medium=referral

看了发现其实就是指针的一些问题嘛。。。

 问题三:

C++智能指针的好处

答:(哇!!贼恐怖,这个东西我只知道泛型编程,其它完全不知道。。。当然还是上网搜了一波)

https://blog.csdn.net/xt_xiaotian/article/details/5714477   很详细

https://blog.csdn.net/zy19940906/article/details/50470087 从底层分析

看了这个之后发现面试官套路我啊,问了第二个问题发现我不知道后,就问智能指针...就是要挂我.....

问题四:

讲一下数据结构list

答:这个问题其实能讲很长时间的,面试官也是给了机会,可惜我没把握住。当时只跟面试官讲了线性表,链表,双向链表,循环链表,并且还是只讲了一下概念,没有深入去讲。

线性表:内存连续,用数组存储,优点便于查询,缺点难于插入删除。

链表:内存不连续,用节点去存储信息,优点插入删除简单,但是查询困难。可以有头结点,有头节点可以在头结点中存储链表长度,不用每次遍历整个数组。

双向链表:每个节点不仅有指向下一个节点的指针,也包含了指向上一个节点的指针。头节点上一个节点是空,同样尾节点下一个节点为空。对比于单向链表的优点在于可以在O(1)的情况下找到当前节点的上一个节点。

循环链表:在双向链表的基础上头节点加了一个指向尾节点的指针,而尾节点也加了一个指向头节点的指针,更加方便查询链表中节点信息。

这个问题还可以扩展到STL list,通过STL list再讲一下vector,再对两者进行对比,综上这个问题可以讲个10来分钟,可惜我就讲了5,6分钟就没了。。。

问题五:

讲一个时间复杂度在nlog(n)的排序算法

答:快速排序关键就是找一个基准,然后把小于这个基准的数排在基准前面,大于的排在后面。再对基准两边的数按同样的方法进行排序,这个过程用递归进行。

快速排序法,这个问题对我来说算是最简单的吧(当时还脑抽的说了个二分,二分是个查找不是排序。。)

问题六:

MFC消息映射的底层实现

答:不清楚MFC消息映射,但我知道Windows消息机制,然后我就对着面试官一通乱讲,听着面试官的反应,貌似讲的还可以(毕竟我还转载过一次windows消息机制)。然后面试官就这个问题又让我讲了一下注册一个新窗口的过程,又是一通子乱讲,最后问了一下lpfnWndProc这个参数的意义,然后我说是窗口处理消息函数。。。。

问题七:

算法题:给你一个很长的字符串(字符未知),如何找到里面出现的第一个不重复的字符(并输出其位置)

答:第一想法就是写一个数组,然后存储所有大小写字母,比如arr[3]就表示arr[x - 'a'],x就是遇到的字母,然后遇到一个字母就把相对应的数组元素加一。结果面试官说假如你不知道这个字符是啥,并且也不知道这段字符串有多长。emmmmmm....这个我就很懵逼了,字符何其多。。。然后在有效的时间内也没有给出答案。这个问题现在也没想出来,有大佬会的指点一下小弟,我如果找到答案的话,在评论里面发。