面试经验(1)

今天去了腾讯面试,面试的是两个师兄,感觉很和蔼,环境也很随和,但是自己的表现并不是特别的完美,面试官好像并不是特别满意。为了积累经验,以后能做到更好,在这里把问题记录下来,为以后做准备。

1、求逆序数对(使用归并排序)

2、单链表翻转(原有链表)

3、引用与指针区别

4、虚函数表
只要我们在类中定义了virtual函数,那么我们在定义对象的时候,C++编译器会在对象中存储一个vptr指针,类中创建的虚函数的地址会存放在一个虚函数表中,vptr指针就是指针這个表的首地址。
这里写图片描述
       

  在发生多态的地方,也就上面的,编译器根本不会去区分,传进来的是子类对象还是父类对象。而是关心print()是否为虚函数,如果是虚函数,就根据不同对象的vptr指针找属于自己的函数。而且父类对象和子类对象都会有vptr指针,传入对象不同,编译器会根据vptr指针,到属于自己虚函数表中找自己的函数。即:vptr—>虚函数表——>函数的入口地址,从而实现了迟绑定(在运行的时候,才会去判断)。

  如果不是虚函数,那么这种绑定关系在编译的时候就已经确定的,也就是静态联编!

  这里,关于虚函数表要说明两点:

  说明1:通过虚函数表指针VPTR调用重写函数是在程序运行时进行的,因此需要通过寻址操作才能确定真正应该调用的函数。而普通成员函数是在编译时就确定了调用的函数。在效率上,虚函数的效率要低很多。

  说明2:出于效率考虑,没有必要将所有成员函数都声明为虚函数

  说明3 :C++编译器,执行play函数,不需要区分是子类对象还是父类对象

扫描二维码关注公众号,回复: 957639 查看本文章

  最后,我们来总结一下多态的实现原理:   
当类中声明虚函数时,编译器会在类中生成一个虚函数表
虚函数表是一个存储类成员函数指针的数据结构
虚函数表是由编译器自动生成与维护的,virtual成员函数会被编译器放入虚函数表中

5、static函数与普通函数的区别
用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。
  在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突。
<2> 静态函数不能被其他文件所用。

6、如何防止头文件被include多次
一种是#ifndef方式,一种是#pragma once方式

7、进程间的通信方式

http://blog.csdn.net/wh_sjc/article/details/70283843

8、unordered_map的实现方式
unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的

9、vector容器如何释放内存
swap()

10、tcp4次挥手中为什么要等待2MSL

http://blog.csdn.net/whuslei/article/details/6667471

11、socket套接字的通信流程

http://blog.csdn.net/dzw19911024/article/details/51321655

12、c++四种强制类型转换

https://www.cnblogs.com/Allen-rg/p/6999360.html

13、从浏览器打开一个页面的流程
a、根据域名访问本地DNS缓存查找ip地址,本地没有请求DNS服务
b、查找到ip地址后三次握手建立tcp连接
c、发起http请求,得到html、css等进行渲染加载页面

14、c++内存泄漏的可能情况
a、new,delete不匹配
b、多态情况下没有虚析构函数
c、缺少拷贝构造函数,造成浅拷贝,两次释放内存导致堆的崩溃

15、c++11auto关键字

https://www.cnblogs.com/QG-whz/p/4951177.html

猜你喜欢

转载自blog.csdn.net/daidaihema/article/details/79491864