注:继续整理他人的面经,提炼出对自己有用的知识点和经验,感觉还是挺有用的!
面经来源(牛客网摘录):
阿里 杭州站 c++研发面试小记
一面(面试官非常懂c++,你说你看过什么书,他就拿书上的东西问你,问的很深,问很多为什么,直到你不会,再引导你)
1、说一说项目
2、网络了解吗?网络编程用的多吗?数据库用过哪些?数据库优化有经验吗?
3、stl中的list中的size函数是如何实现的?是遍历还是设置一个变量来保存?让你实现,你倾向哪一种,为什么?如果采取设置变量来保存size,当执行链表拆分操作(比如给出一个中间节点,以此拆分链表)时,怎么实现?怎么更新size?(只能遍历更新,如此就相当于之前设置的变量无用)-----------(注:此文基于作者读过《stl源码剖析》而问)
4、子类a多重继承于b和c,b和c都有虚函数,此时a中有几张虚函数表?有几个虚函数指针?当依次调用分属b和c的虚函数时,虚函数指针怎么变化?
5、new一个对象涉及几个步骤?其中哪个步骤可以通过重载new操作符来修改。
(参考答案:
new一个对象通常分为两个步骤 首先调用operator new函数 operator new函数再去调用malloc动态分配内存, 然后再调用类的构造函数, 其中可以通过重载operator new函数弄个内存池啥的做自己的内存管理 new本身只是个表达式不能更改的 能改的只有operator new函数, 你可以重载全局的, 也可以重载类自己的)
6、int a[100]; delete a; 上述代码是否有问题,会内存泄漏吗?(不会)
class A {public: int a[100]; }; A* pa = new A[100]; delete pa;上述代码是否有问题?会内存泄漏吗?(不会)
delete 跟 delete []到底内在有何区别?什么情况下必须用delete [],否则内存泄漏。
(
参考答案:
delete跟delete[]都会释放指针所指内存区域(地址会记录区域的大小、数目等,所以无论单个对象还是数组,都能正确释放内存),只不过delete只调用第一个对象的析构函数,而delete[]会调用后续所有对象的析构函数。对于对象数组,只要内存是连续的,用delete来释放是完全没有问题的。delete[]只有在对象中有分配在堆上的数据时才必须使用,因为堆上的数据只有各自的析构函数知道如何释放。)
7、c++中string的赋值函数怎么实现?浅拷贝还是深拷贝?浅拷贝会有什么问题?(一个string delete后,另一个string持有的数据也被清了)深拷贝会有什么问题?(重复,耗费内存)所以,较好的实现应该怎样?(执行浅拷贝,设置一个引用计数,计数减少为0时delete)这样会有线程安全问题吗?怎么解决?
8、写一个单链表逆置函数。
9、我想一个类只有一个实例,怎么实现?(单例模式)这个模式c++里怎么实现?(通过静态局部变量或者全局静态实例)谈谈各自优缺点)
二面(面试官是个搞java的,整体面试气氛有点怪,他不知道问啥好,但又不得不问,挤出了几个问题)
1、说一说项目,挑个最有特色的,说说架构怎么设计的?
2、c++如何防止内存泄漏,有哪些方法?(只想到了智能指针)
3、既然提到了智能指针,你给我实现一下,这个应该是最基本的了。
4、父类中有一个静态变量a,两个局部变量b和c,b在构造函数里初始化,c是声明时直接赋值初始化。子类跟父类完全类似,有一个静态变量d,两个局部变量d和e。当new一个子类实例时,上述6个变量的初始化顺序是怎样的?
5、最后问他的问题,c++开发在阿里的情况,他说阿里用c++的很少,招c++很少,只招厉害的。他最开始也搞c++,然后搞着搞着就搞java去了。。。
hr面
你觉得你最挫败的事是什么?最有成就的是什么?
生活或学习中有没有什么事让你特别有激情?
同学眼里你是怎样的,用三个词来描述?你自己认为呢?也用三个词
你觉得你最大的特点是什么?怎么证明?
来阿里想去什么部门?今后的职业规划是怎样的?
内推:
一面: 蚂蚁金服部门(大概半小时左右)
自我介绍,然后就开始计算机基础一个个的开始问:
进程和线程的区别?
https和http是什么协议,区别,https是如何实现的?
TCP协议介绍?加密算法?MD5是什么?
C++构造函数和析构函数分别能否是虚函数以及其原因。
多态是如何实现的。
C++内存管理和栈,堆等等。
最后问了一个简单的算法题。然后还给介绍了蚂蚁金服部门,包括杭州的和上海这边的,以及他们团队是做什么的,他所在组主要是用java,问我愿不愿意转java。
二面:晚上差不多十点打过来的,面试官说加班很正常。这次是蚂蚁金服在上海的团队打过来的,二面很直接,先是让我介绍我做的项目,就项目一问一答的聊了聊。然后问我会java么,我说我学过用过,但最近未用过。之前做过web的项目,SSM框架,他让我介绍这个项目,解释浏览器输网址到得到页面结果,servlet的处理过程生命周期之类的, 问对MVC的理解, 还有spring框架,解释spring中的反射机制。
carson心得:
三面: 因为二面问的这些问题我真心无力,以为是挂了的,没想到隔了很久接到hr的电话,也是晚上,完全没在状态。时间很短,十五分钟吧,问最近在做的项目,你在里面承担了什么角色,你觉得整个过程自己做的最好的是什么,最不喜欢的过程是什么。以后的职业规划是怎么样的,实习的时间,等等。
三面之后的两天吧,个人中心变成已回绝,自主投递成了新的简历,还是C/C++研发。
专场面试:
一面:笔试居然过了,还是蛮幸运的,预约了11号上午十点半的面试。十点半准时到场,签到完结果在等候厅等了差不多25分钟,才叫我的号去面试。我以为会像TX那样,一个个的房间呢,在一个大厅里,一个个桌子面试官和你面对面坐着,他有电脑,你有铅笔盒白纸,哈哈。这次去居然忘了带简历,面试官问我要简历时,我傻了吧唧的说官网上有,(⊙o⊙)…面试官蛮和蔼的,说真有,然后开始边看简历边让我自我介绍,我说了几句不超过一分钟,囧。他对软件工程专业有一些误解就问我,特地解释说只是个人好奇,不关乎面试,然后我就一通介绍,聊了聊进入正式面试。一来就笑着说,他也不太懂C++,不是说好的专场面试时是对口的么,额。貌似有在用笔记本查一些题目问我。
首先是问我strlen内部是如何实现的,我答了,然后问strlen和sizeof的区别,char* p = "";sizeof(p);然后我回答是指针的大小,分32位系统和64位系统的情况,面试官不是很满意,一直问我你确定,问的我心虚啊,不就是么。然后他写:char str[20] = {'0','1','2','3','4','5','\0'};sizeof(str),strlen(str)分别是多少,我写20,6,结果又被说你确定,为啥呢,为啥你前面是指针,这里变成20了,str不是也是指针么,然后我解释了数组名什么时候退化成指针,此时为啥是20.然后他说好进入下一题。问,那你说一下C语言里面怎么实现多态的,我当时就呆了,难道是问我怎么用C语言去实现面向对象么,看我一脸懵逼样,面试官提醒我C里面不是有虚函数么,啊,我才知道他的意思,原来是他口误……吓死我了,然后我边在纸上画边解释虚函数表,指针vptr等机制,什么时候是override什么时候是隐藏等等。
接着另外又给我一张白纸,说你写一下二叉树的深度优先搜索吧。然后我就说了下我预先的二叉树节点是什么样的,开始在纸上画一画开始写代码。主要是借助stack去实现的,不难就很快完成了,然后开始给他巴拉巴拉的将想法讲代码,可能我写的跟他预想的不太一样,一开始有一些怀疑,后来解释解释还是得到了认可。然后问题转为这样一个函数,你如何去设计测试用例去测试它,原谅我在另一家公司面试时被问过同样的问题,当时心中窃喜,开始巴拉巴拉地讲,分两大类,啥啥的,然后他说,你就按照你说的一条一条的列出来,然后我又开始边写边列,写完所有有效的和无效的,开始说一些恶意的攻击,什么并发啊,二叉树的left指向自己的情况啊,被打断说暂时我们不考虑这些。开始让我归类前面列出的testcase,基本每个问题都一步步深入细问。问我如果真存在我说的二叉树左右子树指向自己的情况,如何去检测,如何去避免。
后来问了什么,记不清了。后面问了一个实际的问题,问百度搜索输入关键字会出现的一些推荐输入,是如何实现的?然后我就又开始说自己的想法,是如何存储的,边说边在纸上画,一问一答的,最后说存的基本是一颗多叉的结构了,好,这道题过。然后说要问我一个他实际工作遇到的一个难题,我当时心里有些懵逼这我怎么可能答得上来,表面还是迷之微笑(⊙o⊙)…问:网站提高广告服务,广告被点击一次,就要相应收取用户一定的广告费,问这个如何实现。当然这个问题的关键在于,广告被点击的量是很大的,而且同时会存在很多,这就引发一个并发的问题,然后就一点点思考一点点回答,我给了我的想法,面试官最后还是给我解释了他们是如何解决的,数据库加version标记,加唯一索引等等操作。
二面:下午叫过去面试时,已经是快两点了吧。先来个自我介绍,面试官感觉很年轻很厉害的样子,时不时笑一笑叫我不要紧张,我表现的很紧张么,好奇怪。又问我要简历,囧!然后让我一个个介绍做过的项目,听我连说的两个项目都是C++,C语言的项目,特别问了我在里面做的是什么,然后就没啥兴趣了,我赶紧又说了我之前还做过Javaweb开发的项目,立刻看到面试官眼前一亮的感觉啊!直接表达很感兴趣,然后就一通问,一通扯,还问我如果让你设计,你怎么去实现MVC,对spring的了解情况,我也扯了扯,实在有点力不从心,他也看出我忘了差不多了……然后问我愿不愿意转Java。问我有没有自主去学习其他的新技术,然后我说了分布式啊,Hadoop啊之类的,毕竟以前上过课嘛,扯了扯,尴了个尬地跟面试官说细节不要问我我不知道的。他又问还有么,然后我开始扯我本科毕业做过的深度学习,深层神经网络的课题,啊呀,他又明确表达很感兴趣,然后让我详细讲述,我就拼命的回忆啊!挺好的,接着他说他很想知道神经网络里面节点,参数我是怎么设置的,啊,我扯不了,只能说我忘了……他报以迷之微笑……还说他们现在很需要做预测的人。
接着让我详细画了做过的一个C++项目中,所有类的设计,之间的关系,等我画完,讲完,开始问我数据怎么存的,有没有用到LRU算法,怎么实现多线程同步的,怎么实现通信的。貌似这位面试官平时也不用C++,边敲键盘边问我,const和static的用法,区别啊!这个我熟啊,1,2,3的一通扯。然后问我C++里面的内存分配内存管理,熟啊画个图详细扯,然后问我网络协议,让我讲浏览器里输入网址到最后得到页面的过程,画图讲,期间我提到DNS,被打断问我DNS是如何实现的。然后问我TCP和UDP的区别,顺便又问了我三次握手,来画个图。然后开始问我对Linux了解么,问了我如何备份数据库,如何定期删除和备份log文件等。然后问了个算法,让我写代码实现如何在一个二叉树中同时找出节点最大值和最小值,要求比较次数尽可能小,我用的是两两比较,得出大的数跟原来初始MAX比较,得出小的数跟原来初始MIN比较,循环直到二叉树遍历完。
问我有没有什么问题问他的,期间他还说他看到我所有的面试经过了,看到我内推蚂蚁金服上海的部门挂了,这次的是在杭州,尴了个尬。然后让我出去等一下,校园大使出来跟我说让我再去等候厅等。
三面:等候厅这个时候都是人啊,就站在外面等了会儿,聊了聊微信,没一会儿就收到短信去面试了。我猜应该是HR,蛮亲切的给人一种叔叔的感觉,然后开始自我介绍啊,聊聊最近在干嘛啊。问我研究生是考还是保送的啊,问我在项目中承担的角色,任务,印象深刻的事情啊,兴奋点啊,最有意思的事情啊。问大学里里做过的最具创新的事情,最有挫败感的事情,最大胆的事情。我真心觉得还不如问我C++多态是如何实现的呢,这些题我答得好困难。问我导师对我的评价是怎么样的,同学的评价呢,在宿舍实验室一般是一个什么样的角色呢。给了好几个假设的场景,问我会如何处理,等等吧。外加还问了问父母的职业啊,独生女否啊,职业规划啊……感觉聊了好久啊,我在煎熬,(⊙o⊙)…最后让我问问题,我问了几个有的没的,然后问他能不能给我一些建议,他蛮好的,跟我说了很多,在这就不写了。最后让我推荐几个身边比较牛逼的同学,我不懂这是几个意思啊,当时也不好意思问,就掏出手机翻通讯录,解释说我身边同学大部分都已经投了简历的了,他也就没有强制我推荐了。面试结束,说后续等通知,我说一周?他说不一定哦,校招还在持续,哈哈,然后就被带出来了。
出来后,几轮面试之后我已经知道门口的是校园大使了,就问他们到底什么时候出结果啊,一问一答的最后还是悄悄跟我说,让填了推荐人,基本就是差不多了。