C++这些年虽然难度大,但是热度仍然不减,在编程排行榜基本上都是前几位,得益于它良好的薪资待遇。无论是即将参加秋招的求职者还是想换工作的小伙伴,给大家整理了之前同学遇到过的C++高频面试题及答案解析,希望能给大家提供帮助。
1、简单介绍一下智能指针
1. 空指针:指针变量指向内从中编号为0的空间。用于初始化指针变量。空指针指向的内存是不可以被访问的。nullptr;
2. 野指针:指针变量指向非法的内存空间。比如指针指向的内存被释放了,但是指针没有置nullptr. 多个指针指向同一个内存,当free掉一个指针之后,其他指针就变成了野指针。
3. 对象重复释放,内存泄露
4. 不匹配的new delete的问题
智能指针:
如图 P1 P2同时指向同一个object. 在P2中,object被析构了,那么P1会变成野指针。
智能指针指向一个中间层,中间层再指向object. proxy里面使用一个引用计数变量。当p1不指向proxy的话,计数-1. 当计数为0时,proxy将被释放掉。
unique_ptr: 他是一个独享所有权的智能指针。唯一的指针,不允许其他指针与他共享指向的对象。禁止复制。但可以进行移动构造和移动赋值构造std.move()。 此时原来指向的位置就变成了空指针。
shared_ptr: 可被多个指针共享。相当于原始指针,增加了计数机制。析构函数函数应该是相对简单的函数。它使用计数机制来表明资源被几个指针共享,可以通过成员函数use_count()来查看资源的所有者个数。除了可以通过new来构造,还可以通过传入auto_ptr、unique_ptr、weak_ptr来构造。调用release()释放资源所权,计数减一;
weak_ptr: 观察指针,解决shared_ptr相互(循环)引用的问题(参见muduo库)。只看看,不进行操作。shared_ptr可以直接赋值给它,它可以通过lock函数来获得shared_ptr。(通常搭配shared_ptr使用);
auto_ptr: 已被废弃
2、C++引用和指针有什么区别?
相同点:都是地址的概念;
区别:指针指向一块儿内存,他的内容是所指内存的地址。引用则是某块儿内存的别名,引用的指向不会变化。
1:现象上看:指针在运行是可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。
2:从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域。
3:不存在指向空值的引用, 但指针可以为空
4:理论上,对于指针的级数没有限制,但是引用只能是一级。
3、王者荣耀游戏中,有10个英雄,若干野怪,如何快速找最近英雄?
HashTable,或者KDTree
4、简单介绍下SPI协议
SPI协议是一种采用主从模式的串行,全双工,同步通信总线,包括时钟,输入,输出,片选四个信号线,片选信号用于选择slave设备,输入输出的每个bit都需要和时钟沿同步
5、C++如何实现只在栈上实例化对象?
只有使用new运算符,对象才会建立在堆上,因此要禁用new运算符才能只在栈上分配空间。但new操作符是C++内建的,所以必须要先认清一个事实即:new operator总是先调用operator new,所以我们只要堆new操作符进行重载,并将它声明为private的,就能保证不能再使用new实例化对象。
————————————
更多面试题,点击蓝色链接获取,随时更新哦~