第一次电面

2019-04-13 16:24发布

      昨天经历了人生第一次电话面试,感觉收获还是很多的。从头说起。电面的前一天,面试官打来电话确认电面时间,还强调那个时间没空的话可以调整,很人性化。接过电话后,开始准备。横竖只有一天,也准备不了什么,上网搜所谓电面必问的问题,准备了个人介绍和项目经历的介绍,结果都没怎么派上用场......      电面前一个多小时就在宿舍里等待(幸好那段时间寝室没人),还是有些紧张的。比约定时间迟了十分钟左右,电话终于来了。一开始再次问我现在是否方便电面,然后问我能够实习的时间,说希望实习的时间能长一点,6个月。接着正式开始。没让我自我介绍,只是让我介绍做过的项目。我只好把实验室的项目拿出来说一下,他只听了大概,就问是不是偏向研究的,我说是,他就没有深究了。他转而问我有没有参加过真正做成产品的项目,我只能很遗憾地表示没有......所以,企业看重的还是你在开发真正的项目上的经验和能力。      接着问技术问题。得知我对C++最熟后,主要问的也是C++的问题。下面列举几个,也算记载。      Q1:extern的作用。我只答出来一个,即extern声明的变量或函数可以在本模块或其他模块中使用。但是,还有一个我没答出来,如extern "C",指的是被extern "C"修饰的变量和函数是按C语言方式编译和连接的。      Q2:类中的成员函数,如void f()const{},加了const的含义。当时我也完全记不起来,应该是表示f是常量成员函数,意义有:1常量成员函数中不能修改调用对象的值;2常量对象只能调用常量成员函数。      Q3:声明和定义有什么不同,一个变量可以被声明和定义多少次。我知道声明和定义的不同在于,定义会为变量分配内存空间。然而,对于声明或定义是否可以多次的问题,我却感到疑惑,但其实答案很显然,既然声明不分配内存而定义分配,那就是可以声明多次,而定义只能一次。我感到疑惑的还有一点:什么是声明,什么是定义。后来查了一下,答案也许是:平时的比如int a即是声明又是定义,而extern int a就只是声明,而不是定义。extern考得还真多啊。      Q4:定义一个空类,如class A{};这样,问sizeof(A)返回几。我蒙了,还是不懂。后来试了一下,应该是1。而且A的对象得到的也是1。至于为什么,问了周,说是空类的一个标识。就是说class A{};和class B{};虽然都是空类,然而却是不同的。可以通过把这两个类作为两个同名函数的不同参数进行检验。      Q5:vtable。每一个“内含虚函数的类”,编译器都会为它做出一个虚函数表,表中的每个元素都指向一个虚函数的地址。当然,编译器也会为类加上一个成员变量,是一个指向该虚函数表的指针。我在侯捷的《深入浅出MFC》中看过上面这一段,但是当时就是没反应过来,sigh。      上面的几个问题,除了Q4确实没听过,其他都看过的,但是由于没怎么在实践中用过,所以很快就又忘了。人的记性真是不可靠!      其他还有一些,如Map在C++里面是用什么数据结构实现的,Map里面的key可以是自定义的类吗,当然我是彻底不知道。我坦诚地向面试官说不知道,然后说猜Map是用hash table实现,面试官回答:在C#里面,Map是用hash table实现的,但是C++不是。哦...不管怎么样,也算沾了一点边。还问我有没有Linux下的编程经验,懂什么脚本语言,有没有做过测试等等等。一概只能答不知道,让我很是郁闷。      面试官实在没办法,只好问了我几个算法题。有找第K小的数;从大量的整型数中,如一亿个数中,找出最小的前一百个数,我想到了用堆来做,但是不能完整地说出思路(因为也不可能仔细思考),后来还是面试官对我的这个思路给予肯定并告诉我答案。微软的《编程之美》一书中有这类问题的描述和针对不同情况的多种解法,后面还有一些应用中的变种问题,值得仔细琢磨。另外还问了排序算法的一些问题,比较简单,不再赘述。      总结这次电面的感受,有两点,一是面试官很不错,面试过程中就算我答错了,也会安慰我没关系,我有的答错的题还会告诉我正确的答案,使得我原本绷紧的神经得到极大的缓解。二,通过这次面试,且不论结果如何,让我增长了面试的经验,体现在下次面试就可以不这么紧张,更加从容,还有面试过程中自己的不足之处得以曝露,便于自己去弥补,最后是清楚了一点,一般的公司是希望你去做engineering的,所以技术很重要。