搜狗2015年校招一面面经(2014/9/25)主要偏向C++

匿名网友 匿名网友 发布于: 2015-10-13 00:00:00
阅读 242 收藏 0 点赞 0 评论 0

面试官:C++的三个特性?

:封装、继承、多态。

面试官:多态是如何实现的?

:是通过虚函数实现的。

面试官:那就给我讲下虚表吧。

:如果某个类含有虚函数,或者它的基类有虚函数,那么,这个类中就有虚表指针,指向一个虚表,其中包含这个类的虚函数地址,当然,还包括派生而来的虚函数地址。当程序员用基类指针调用虚函数时,编译器并不知道应该调用基类的虚函数还是派生类的虚函数,但是,编译器知道这个虚函数在虚表中的索引,而且,某个虚函数在基类的虚表和派生类的虚表中的索引是一样的。它会将通过基类指针调用虚函数的代码转变为通过虚表的索引找到该函数的地址,于是就调用了该虚函数,但是这个函数会根据基类和派生类而有所不同,就实现了多态。

面试官:说下C++中const成员函数吧。

:const成员函数是说这个函数不会改变类的数据成员。

面试官:当类的数据成员用某个关键字修饰时,const成员函数还是可以修改该数据成员,这个关键字是什么?

;mutable,它可以将类的逻辑行为和物理表示分隔开来。

面试官:那关键字volatile是什么意思呢?

:这个没怎么用过,忘记了。。。(回来查了下,volatile是为了阻止编译器对变量的访问进行优化,为了提高运行速度,编译器可能会将变量存放到寄存器中,但是,这个变量可能会随时变化,于是,有可能得到过期的数据,为了阻止这个优化,可以用volatile修饰该变量,那么,当程序访问该变量时,每次都去变量的存放内存去获取数据,而不从寄存器获取)。

面试官:说下extern “C”的作用吧。

:C++为了实现函数的重载,在进行编译时会对函数的名字进行变换,变成内部名字,而C是不需要的。因此,当用extern “C”修饰函数时,就告诉编译器“不要对函数的名字进行变换”。其它的作用就不太了解了。

面试官:基本就是这个用处。用过智能指针吗?

:用过。

面试官:有哪些智能指针?

:C++99中有auto_ptr,C++11引入了Boost库中的几个智能指针,例如scoped_ptr等。

面试官:auto_ptr有什么问题?

:复制和赋值行为具有破坏性。当将一个智能指针p1赋给另一个智能指针p2时,p1就不持有任何指针了,也就是说,它跟一般的赋值语义不一样。

面试官:如果让你设计一个智能指针,你会如何设计?

:(我给出的方案类似于More Effective C++中的智能指针)。

面试官:下面我们来做一个题目吧。逆转一个链表。

:(手写头插法代码)。

面试官:还有别的方法吗?能不能换种方法实现。

:可以用递归。(说了递归的思路)。

面试官:嗯,差不多了。如果让你设计一个自动更新的程序,你会如何设计?

:当用户第一次打开应用程序时,客户端先向服务器请求最新的版本号,然后客户端将获取的版本号与本地的版本号进行比对,如果比本地版本号大,说明有最新的版本。然后再向服务器请求最新版本的安装包。

面试官:如何知道后来请求的安装包就是我之前想请求的最新的安装包呢?如果在客户端请求最新版本号之后,后台开发人员发现新版本有问题,将新版本撤下,换上旧版本呢?

:那就是个验证问题吧,可以用md5。

面试官:嗯。(也不知道对不对)。

面试官:手机生产厂商需要测试手机的抗摔性,将手机从楼上往下抛,假设这栋楼有100层,有两部手机,如何测得手机的抗摔性。

:搞不出来这个题。(听到这个题目,就知道是楼层扔鸡蛋问题,不过还没搞明白那个题,回来查了下,感觉好复杂的样子)。

评论列表