如何优雅的通过C++面试(附基础+数据库+项目经验+……)
很多人说C++是性价比最低的语言,学习难度高,工资水平在编程语言里并不出众,而且适用范围在慢慢变窄,C++的开发效率也经常被大家所诟病。
但是我并不认为,我觉得学习一门编程语言本身就是一次投资和积累,比如之前在学校我只学过C++和Java,后来实习做游戏开发用过c#,js和lua,感觉有了C++和Java的基础,这些学起来都十分快。所以我认为语言不是重点,重点是数据结构,操作系统,网络原理和算法等。
今天我就跟大家分享一下如何优雅的通过C++面试?主要从语言基础、数据库、项目经验等方面,来跟大家分享一些我的面试心得。
语言基础
C++虚函数这是面试初、中级C ++职位一个概率95%以上的面试题。一般有以下几种问法:
1、在有继承关系的父子类中,构建和析构一个子类对象时,父子构造函数和析构函数的执行顺序分别是怎样的?
2、在有继承关系的类体系中,父类的构造函数和析构函数一定要申明为virtual 吗?如果不申明为virtual 会怎样?
3、什么是C++ 多态?C++ 多态的实现原理是什么?
4、什么是虚函数?虚函数的实现原理是什么?
5、什么是虚表?虚表的内存结构布局如何?虚表的第一项(或第二项)是什么?
6、菱形继承(类D同时继承B和C,B和C又继承自A)体系下,虚表在各个类中的布局如何?如果类B和类C同时有一个成员变了m,m如何在D对象的内存地址上分布的?是否会相互覆盖?
算法与数据结构基础
说到算法和数据结构,对于社招人士和对于应届生一般是不一样的,对于大的互联网公司和一般的小的企业也是不一样的。下面根据我当面试官面试别人和找工作被别人面试经验来谈一谈。
1、排序(常考的排序按频率考排序为:快速排序> 冒泡排序> 归并排序> 桶排序)
一般对于对算法基础有要求的公司,如果你是应届生或者工作经验在一至三年内,以上算法如果写不出来,给面试官的影响会非常不好,甚至直接被pass掉。对于工作三年以上的社会人士,如果写不出来,但是能分析出其算法复杂度、最好和最坏的情况下的复杂度,说出算法大致原理,在多数面试官面前也可以过的。注意,如果你是学生,写不出来或者写的不对,基本上面试过不了。
2、二分查找
二分查找的算法尽量要求写出来。当然,大多数面试官并不会直接问你二分查找,而是结合具体的场景,例如如何求一个数的平方根,这个时候你要能想到是二分查找。
3、链表
无论是应届生还是工作年限不长的社会人士,链表常见的操作一定要熟练写出来,如链表的查找、定位、反转、连接等等。还有一些经典的问题也经常被问到,如两个链表如何判断有环链表的问题一般不难,但是链表的问题存在非常多的“ 坑 ”,如很多人不注意边界检查、空链表、返回一个链表的函数应该返回链表的头指针等等。
4、队列与栈
对于应届生来说一般这一类问的比较少,但是对于社会人士尤其是中高级岗位开发,会结合相关的问题问的比较多,例如让面试者利用队列写一个多线程下的生产者和消费者程序,全面考察的多线程的资源同步与竞态问题。
5、哈希表
哈希表是考察最多的数据结构之一。常见的问题有哈希冲突的检测、让面试者写一个哈希插入函数等等。基本上一场面试下来不考察红黑树基本上就会问哈希表,而且问题可浅可深。
6、树
面试高频的树是红黑树,也有一部分是B树(B+树)。红黑树一般的问的深浅不一,大多数面试官只要能说出红黑树的概念、左旋右旋的方式、分析出查找和插入的平均算法复杂度和最好最坏时的算法复杂度,并不要写面试者写出具体代码实现。
多线程开发基础
现如今的多核CPU早已经是司空见惯,而多线程编程早已经是“飞入寻常百姓家”。对于大多数桌面应用(与Web开发相对),尤其是像后台开发这样的岗位,且面试者是社会人员(有一定的工作经验),如果面试者不熟悉多线程编程,那么一般会被直接pass掉。
“ 熟悉多线程编程 ”到底熟悉到什么程度呢?一般包括:知道何种场合下需要新建新的线程、线程如何创建和等待、线程与进程的关系、线程局部存储(TLS或者叫thread local)、多线程访问资源产生竞态的原因和解决方案等等、熟练使用所在操作系统平台提供的线程同步的各种原语。
对于C++开发者,你需要:
对于Windows开发者,你需要熟练使用Interlock系列函数、CriticalSection、Event、Mutex、Semphore等API 函数和两个重要的函数WaitForSingleObject、WaitForMultipleObjects。
对于linux开发者,你需要熟练使用mutex、semphore、condition_variable、read-write-lock 等操作系统API。
对于Java,你需要熟悉使用synchronized关键字、CountDownLatch、CyclicBarrier、Semaphore以及java.util.concurrent 等包中的大多数线程同步对象。
数据库
数据库知识一般在大的互联网企业对应届生不做硬性要求,对于小的互联网企业或社会人士一般有一定的要求。其要求一般包括:
1、熟悉基本SQL操作。包括增删改查(insert、delete、update、select语句),排序order,条件查询(where子语句),限制查询结果数量(LIMIT语句)等。
2、稍微高级一点的SQL 操作(如Group by,in,join,left join,多表联合查询,别名的使用,select 子语句等)。
3、索引的概念、索引的原理、索引的创建技巧。
4、数据库本身的操作,建库建表,数据的导入导出。
5、数据库用户权限控制(权限机制)。
6、MySQL的两种数据库引擎的区别。
7、SQL 优化技巧。
项目经验
除了社会招聘和一些小型的企业,一般的大型互联网公司对应届生不会做过多的项目经验要求,而是希望他们算法与数据结构等基础扎实、动手实践能力强即可。对于一般的小公司,对于应届生会要求其至少熟练使用一门编程语言以及相应的开发工具,号称熟悉linux C++ 开发的面试者,不熟要求其至少熟练使用一门编程语言以及相应的开发工具,号称熟悉linux C++ 开发的面试者,不熟OllyDbg,基本上也是名不符实的;号称熟悉VC++ 开发,连F8、F9、F10、F11、F12等快捷键不熟悉也是难以经得住面试官的提问的;号称熟悉Java 开发的却对IDEA 或eclipse 陌生,这也是说不过去的。
这里给一些学历不算好,学校不是非常有名,尤其是二本以下的广大想进入IT 行业的同学一个建议,在大学期间除了要学好计算机专业基础知识以外,一定要熟练使用一门编程语言以及相应的开发工具。很多同学可能纠结大学或者研究生期间要不要跟着导师做一些项目。当然,如果这些项目是课程要求,那么你必须得参加;如果这些项目是可以选择性的,尤其是一些仅仅拿着第三方的库进行所谓的包装和加工,那么建议可以少参加一些。
如果觉得文章有用欢迎大家积极转发和收藏,获取更多编程实用干货也可以关注我的头条号~