此面经禁止任何形式的转载,请各种公众号 知乎号绕道
本人leetcode 600题+经验
一面
1.手写单例模式
C++ 静态局部变量 能保证线程安全
问了别的方式std::call_once或者静态成员变量,但是一般都会用静态局部变量
C++没有java的volatile能阻止指令重排,不能用DCL
2.malloc和new
malloc分配内存
new是操作符重载 分配内存+构造函数
3.多态
C++可以用继承和模板实现 个人更倾向于模板
4.继承
讲了下虚表
5.构造函数和析构函数能不能是虚函数
析构必须为虚,构造不能,结合虚表和构造析构的调用顺序来讲
6.模板和继承的对比
模板默认内联,且没有虚表指针,调用开销小
7.模板的缺点
一个是编译慢一个是编译产物更占用内存
8.模板是怎么编译的
编译期碰到了就生成需要的代码,每个.o都会有用到的定义
所以链接的时候要去掉重定义,因此编的慢
9.智能指针
stl的三种 还有android的sp/wp都讲了一下,这块讲的比较细,面试官一直打断问细节
10.手写智能指针
11.左值右值的区别
12.完美转发
13.聊项目
1. 虚继承虚表
2. C++ 4种cast 区别和主要使用场景
3. 场景类算法题 有依赖关系的进程启动管理
类似leetcode 1136 平行课程
4. 聊项目
1. 聊项目
2. 下面的代码会发生什么?
class Foo { public: A() {} virtual B() {} C() { std::cout << this << std::endl; } }; Foo* temp = nullptr; temp->A(); temp->B(); temp->C();
1)函数A,什么都不会发生;
2)函数B,crash
3)函数C,打印地址0
C++的成员函数,如果使用了this相关的,那么编译器在编译时会给函数入参加入this指针作为入参。A不需要,因此没有this指针作为入参;B和C需要,其中B是虚函数,需要找到虚表,即需要解引用,空指针解引用直接就会崩溃,C不需要解引用,只会打印空指针的地址0。
四面(HR面):
总体来说 字节的流程非常快 由于个人工作原因 很难约面试时间的情况下(面试大概花了十来天) 大概是三周拿到正式offer
全部评论
(0) 回帖