剑指C++面试

时间:2025-05-12 09:05:50

传闻公司老总欠下巨款,带着小姨子跑路了~  树倒猢狲散,接下来要好好准备面试,以期找到一份满意的工作。

面试准备分下面几个方面进行,形成面试系列文章,文章内容以问答的方式呈现。

1.C++语言基础

传统C++:

虚函数必知必问(父子类构造析构顺序、父类析构函数应该声明为virtual吗) 、多重继承类成员在空间中的分布、四类转型操作符(reinterpret_cast等)使用场景、static关键字的作用、虚函数表的布局(菱形继承的缺点以及每个对象的空间分布)

现代C++:

auto关键字、左值与右值、移动语义与完美转发、for-each循环、智能指针(std::shared_ptr、std::unique_ptr实现细节)、RAII概念、STL容器的emplace_back、线程库std::thread+std::mutex+std::conditon_variable+std::lock_forward、lambda捕获、std::bind+std::function等(待补充)

2.算法与数据结构基础

1)排序(快速排序>冒泡排序>归并排序>桶排序),给出实现原理,分析算法复杂度、最好最坏情况下的复杂度。

2)二分查找使用场景

3)链表的创建、插入、删除、查找、翻转、连接,算法需尽量写出来,注意边界检查、空指针、函数返回链表头部指针以建立引用等

4)队列与栈

队列涉及消费者-生产者模型、多线程同步等

栈的问题通常结合函数调用展开。比如printf函数为什么不能声明为 stdcall方式

5)哈希表(问的比较多)

哈希冲突的检测、哈希插入函数实现、

6)树

红黑树 概念 左旋右旋的方式、分析查找和插入时的平均算法复杂度、最好最坏时的算法复杂度,涉及STL中的MAP

B树问的较少,变形问题:MySQL 索引实现原理

7)其他的一些算法

A*寻路,霍夫曼编码等

3.编码基本功

编程素养如编码风格、计算机英语水平、调试能力等(调试能力是大牛必备)

基础编码题如实现memmove、strcopy、atoi等

4.多线程开发基础

知道何时新建线程、如何创建和等待线程、线程与进程的关系、线程局部存储、多线程竞态的产生和避免(死锁处理)

熟悉日常开发平台所属操作系统的线程同步原语(CriticalSection、Event、Mutex、Sempored、WaitForSingleObject、WaitForMultipleObject)

5.数据库

①传统关系型数据库

1)基本sql操作如增删改查(Insert、delete、update、select)、排序(order)、条件查询(where子句)、限制查询结果数量(limit语句)

2)  高级点的sql操作如(Group by,in,join,left join,多表联合查询,别名使用,select子语句等)

3)数据库本身的操作,建库建表、数据的导入导出

4)SQL优化技巧(非重点)

②内存数据库(redis):

这么说吧,熟悉redis是后台开发的基本要求了。

1)基础用法:redis的基础数据类型、数据持久化、事务等

2)redis源码层面:redis的网络通信模型、redis各种数据结构的实现

redis本身就是一个非常值得学习的开源代码库

6.网络编程

select函数用法、非阻塞connect函数写法、阻塞socket与非阻塞socket区别、send/recv函数的返回值情形、reuse_addr选项等。Windows平台上的WSAEventSelect、

WSAAsyncSelect函数用法、完成端口(IOCP)模型。

更深入的一些知识点有:

1)nagle算法

2)keeplive选项

3)Linger选项(在http中send完后是否立即close socket)

4)处理大量CLOSE_WAIT或TIME_WAIT

5)通讯协议如何设计或如何解决数据包的粘包与分片问题

6)心跳机制如何设计(如何检查死链)

7)断线重连机制如何设计

8)对IO Multiplexing技术的理解

9)如何正确收发数据包,收发缓冲区如何设计

10)优雅关闭

11)定时器如何设计

12)流量拥塞与控制机制

13)tcp与udp的区别与适用场景

14)http中的GET/POST区别

7.项目经验总结

项目整体的架构图、负责处理的模块、解决过什么难以排查的bug等等