BAT 某厂C++面经+口头offer | 掘金技术征文

楼主8号内推,29号面完全部流程,一二面隔的时间有点远了,有些问题记不太清,这里把能想到的都写下来吧。

一面(1小时):


前面10分钟简单聊了下研究方向。后面全程C++。
Q:主要语言是C++是吧,那咱们先来考察一下C++的基础。
A: 好的。


Q:C++里是怎么定义常量的?常量存放在内存的哪一个位置?
A:常量在C++里的定义就是一个top-level const加上对象类型,常量定义必须初始化。对于局部对象,常量存放在栈区,对于全局对象,常量存放在全局/静态存储区。对于字面值常量,常量存放在常量存储区。


Q:你刚刚说到了const,const修饰成员函数的目的是什么?
A:const修饰的成员函数代表函数调用不会对对象作出任何更改,事实上,若是确认不会对对象作更改,就应该为函数加上const限定,这样不管const对象仍是普通对象均可以调用该函数。


Q:那若是同时定义了两个函数,一个带const,一个不带,会有问题吗?
A:不会,这至关于函数的重载。


Q:C++ 类内能够定义引用数据成员吗?
A:能够,必须经过成员函数初始化列表初始化。


Q:new/delete与malloc/free的区别是什么?
A:首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数。


Q:你博客里提到了隐式类型转换,能简单说说吗?
A:首先,对于内置类型,低精度的变量给高精度变量赋值会发生隐式类型转换,其次,对于只存在单个参数的构造函数的对象构造来讲,函数调用能够直接使用该参数传入,编译器会自动调用其构造函数生成临时对象。


Q:如何避免?
A:explicit关键字。


Q:说说你了解的类型转换。
A:C++类型转换有四种。(这四种请你们本身去查)


Q:说说reinterpret_cast.
A: 这种是不经常使用的,能够用于任意类型的指针之间的转换,对转换的结果不作任何保证,可能被用于哈希(此处不肯定)。


Q:说说dynamic_cast
A: 这种其实也是不被推荐使用的,更多使用static_cast,dynamic自己只能用于存在虚函数的父子关系的强制类型转换,对于指针,转换失败则返回nullptr,对于引用,转换失败会抛出异常。


Q:说说const_cast
A:事实上的用途仍是很广泛的。对于未定义const版本的成员函数,咱们一般须要使用const_cast来去除const引用对象的const,完成函数调用。另一种使用方式,结合static_cast,能够在非const版本的成员函数内添加const,调用完const版本的成员函数后,再使用const_cast去除const限定。


Q:说说你了解的RTTI.
A:运行时类型检查,在C++层面主要体如今dynamic_cast和typeid.


Q:具体是怎么实现的。
A:VS中虚函数表的-1位置存放了指向type_info的指针。对于存在虚函数的类型,typeid和dynamic_cast都会去查询type_info.


Q:你刚刚提到虚函数表,具体是怎样实现运行时多态的。
A:简单来说,子类若重写父类虚函数,虚函数表中,该函数的地址会被替换,对于存在虚函数的类的对象,在VS中,对象的对象模型的头部存放指向虚函数表的指针,经过该机制实现多态。


Q:C++函数栈空间的最大值 ?
A:默认是1M,不过能够调整。


Q:extern “C” ?
A:C++调用C函数须要extern C,由于C语言没有函数重载。


Q:设计模式了解吗,介绍一下单例模式。
A:C++的实现有两种,一种经过局部静态变量,利用其只初始化一次的特色,返回对象。另一种,则是定义全局的指针,getInstance判断该指针是否为空,为空时才实例化对象。


Q:你说的第二种就是所谓的懒加载。如今有一个问题,若是并发访问,该怎么作。
A:使用锁机制,防止屡次访问。


Q:你的锁是锁住全部的代码吗?
A:是。


Q:这样会屡次重复判断是否为空,而每次都会加锁,有什么办法改善?
A:能够这样,第一次判断为空不加锁,若为空,再进行加锁判断是否为空,若为空则生成对象。


Q:你提到了锁机制,那么C++的锁你知道几种。
A:锁包括互斥锁,条件变量,自旋锁和读写锁(后两个没答出来)。


Q:说一说你用到的。
A:生产者消费者问题利用互斥锁和条件变量能够很容易解决,条件变量这里起到了替代信号量的做用。balabala。


Q:C++两种map。
A:unordered_map(哈希表)和map(红黑树)。


Q:红黑树了解吗?
A:只知道本质是一颗BST,插入O(logN)。


Q: 快排的时间复杂度最差是多少?
A:O(N2)


Q:何时最差?
A:枢纽元左侧元素都比枢纽元小(不肯定)。


Q:稳定排序哪几种?为何?
A:查课本吧,很简单。


Q:聊聊计算机网络的内容吧,TCP三次握手是怎样的?
A:这部分你们参考相关课本。


Q:为何两次不能够?
A:服务器端未收到客户端的链接确认,所以必须三次。


Q:四次呢?
A:链接确认后第三次的握手已经包含了客户端数据,不须要四次。


Q:TCP拥塞了解吗。
A:没看。(直接跳过了这部分)。


Q:死锁产生的必要条件?
A: 四个必要条件。


Q:如何预防?
A:-请查书。


Q:最后几个问题,你平时如何提高本身的,在语言方面?
A:一些经典的书籍,会认真去看,同时,也会看一些对语言新特性介绍的书籍,保持敏感。


Q:分别有哪些书?
A:C++ primer,经典的入门书,深刻探索C++对象模型,帮助我很好的理解C++的对象模型。effective C++,经典的关于C++进阶的使用经验。effective modern C++:关于C++11/14新特性的深刻探讨。


Q:说说C++primer中你以为感觉最深入的内容。
A:这本书是入门必读,我感受印象最深入的就是C++ 11的新特性,好比自动类型推导,lambda,右值引用(这里被打断了)。


Q:如今在看哪些书?
A:正在看的是STL源码剖析。


Q:个人问题问完了,你有什么要问个人吗?
A:对个人面试评价。(C++掌握程度很深)

一面确实过久远了,可能有些东西想不起来。当时全程基本都是C++的内容,稍微穿插了别的领域的问题。

二面:二面很是戏剧性,对大多数人不适用,全程跟面试官讨论了作的研究,面试时间15分钟结束。


三面(3.26):
首先就是问研究方向,扯了10分钟,而后C++。
问题1:
Q:C语言是怎么进行函数调用的?
A:每个函数调用都会分配函数栈,在栈内进行函数执行过程。
Q:接着:C语言参数压栈顺序?
A:从右到左
Q:再来:C语言如何处理返回值?
A:C语言不知道,C++会生成一个临时变量,把它的引用做为函数参数传入函数内。

问题2: 面试

Q:C++如何处理内存泄漏?
A:紧张地瞎说了一堆,提醒你们,不会的直接说不会。

问题3:
C++ 如何处理程序异常?
A:查看对应的报错代码,根据代码定位具体问题。(瞎扯)

问题4:算法

Q:工厂模式?优势?设计模式

A:优势就是解耦,代码复用,更改功能容易。服务器


HR(3.29):HR面避免踩坑,主要是一些性格上的问题要当心,其它没什么。
OFFER确认(3.30):跟领导讨论实习的工做内容和实习时间。
具体就是这些。楼主准备的内容大都是C++以及算法,但最后面试的过程是基本没有问到算法,语言和研究经历占了很大一部分,总结就是必定要有本身特别擅长的一个方面去打动你的面试官。 

掘金技术征文连接👉 https://juejin.im/post/5aaf2a95f265da239b413aa1网络

相关文章
相关标签/搜索