在大概5,6天前经历的一次面试,当时把问题记下来了,后来这几天有腾讯的一个竞赛,就一直没有整理,结果这竞赛把我虐的一愣一愣的,脑细胞都死完了,晚上仍是整理一下面试题,恢复一下脑细胞。。此次面试让我知道了我这条鱼究竟是有多咸,也知道了C++究竟是有多么的博大精深。。html
问题一:c++
.C++为何要定义虚析构函数,多态性是如何实现的?(这个问题其实挺基础的,c++面试必问的)面试
答:c++多态分编译时多态和运行时多态,编译时多态指函数重载和泛型编程,运行时多态指的是虚函数。算法
主要讲一下虚函数,在函数前面加上virtual就是虚函数。在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。若是对象类型是派生类,就调用派生类的函数;若是对象类型是基类,就调用基类的函数。(有一句话说的很好,忘了在哪看得了)没有加virtual的话,对象按声明的类型调用函数,加virtual的话对象按实际类型调用函数。编程
(C++虚函数底层实现推荐看C++反汇编揭秘这本书)当类中定义有虚函数时,编译器会将该类中全部虚函数地址保存在一张表中,这张表被称为虚函数地址表(虚表)。同时,编译器还会在类中添加一个隐藏的数据成员,成为虚表指针。该指针保存着虚表的首地址,用来记录和查找虚函数。只要类中有虚函数,就必定有虚表存在,而且若是有子类继承,就算子类中没有虚函数,子类也会有虚表。若是子类继承多个父类,而且多个父类都有本身的虚函数,那么子类中会有一个虚表指针数组,包含每一个父类的虚表指针。windows
问题二:数组
举一个本身遇到的处理c++内存(泄露)方面的经历数据结构
答:没有。。。。(很尴尬,由于不知道到底要问什么,而且确实没有相关经验。。)函数
不事后来上网搜了搜,发现了一个帖子很详细很完整(惋惜如今才发现)https://www.cnblogs.com/findumars/p/5929831.html?utm_source=itdadao&utm_medium=referralspa
看了发现其实就是指针的一些问题嘛。。。
问题三:
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....这个我就很懵逼了,字符何其多。。。而后在有效的时间内也没有给出答案。这个问题如今也没想出来,有大佬会的指点一下小弟,我若是找到答案的话,在评论里面发。