Linux C++ 面试问题合集
1. C++语言基础
1.1 继承和多态
- 在有继承关系的父子类中,构建和析构一个子类对象时,父子构造函数和析构函数的执行顺序分别是怎样的?
- 在有继承关系的类体系中,父类的构造函数和析构函数一定要申明为 virtual 吗?如果不申明为 virtual 会怎样?
- 什么是 C++ 多态?C++ 多态的实现原理是什么?
- 什么是虚函数?虚函数的实现原理是什么?
- 什么是虚表?虚表的内存结构布局如何?虚表的第一项(或第二项)是什么?
- 菱形继承(类 D 同时继承 B 和 C,B 和 C又继承自A)体系下,虚表在各个类中的布局如何?如果类B和类C同时有一个成员变了m,m如何在D对象的内存地址上分布的?是否会相互覆盖?
1.2 C++ 11/14/17 特性
- 统一的类成员初始化语法与 std::initializer_list
- auto 关键字
- final/override/=default/=delete 语法
- Range-based 循环语法
- 结构化绑定
- stl 容器新增的实用方法
- std::thread
- 线程局部存储 thread_local
- 线程同步原语 std::mutex、std::condition_variable 等
- 原子操作类
- 智能指针类
- std::bind/std::function
2. 数据结构与算法/LeetCode
2.1 排序
- 快速排序
- 冒泡排序
- 归并排序
- 桶排序
2.2 查找
- 二分查找
2.3 链表
2.4 队列
2.5 栈
2.6 哈希表
- 哈希冲突的检测
- 写一个哈希插入函数
2.7 树
- 红黑树
- B+树
3. 数据库
3.1 SQL Basic
增删改查(insert、delete、update、select语句),排序 order,条件查询(where 子语句),限制查询结果数量(LIMIT语句)等
3.2 SQL Advance
Group by,in,join,left join,多表联合查询,别名的使用,select 子语句等
3.3 索引
索引的概念、索引的原理、索引的创建技巧
3.4 MySQL两种数据引擎的区别
3.5 SQL优化技巧
3.6 数据库用户权限机制
4. 多线程
4.1 Linux多线程操作系统级API
mutex、semphore、condition_variable、read-write-lock
4. 网络编程
4.1 基础网络通信
TCP三次握手和四次挥手
socket 基础 API 的使用
客户端与服务器端网络通信的流程
客户端创建 socket -> 连接 server ->收发数据;
服务器端创建 socket -> 绑定 IP 和端口号 -> 启动侦听 ->接受客户端连接 ->与客户端通信收发数据
TCP 与 UDP 的区别
4.2 Advance Network
- select 函数的用法
- 非阻塞 connect 函数的写法
- epoll 的水平和边缘模式
- 阻塞socket与非阻塞 socket 的区别
- send/recv 函数的返回值情形
- REUSE_ADDR 选项
4.3 网络通信库
- nagle 算法;
- keepalive 选项;
- Linger 选项;
- 对于某一端出现大量 CLOSE_WAIT 或者 TIME_WAIT 如何解决;
- 通讯协议如何设计或如何解决数据包的粘包与分片问题;
- 心跳机制如何设计;
- 断线重连机制如何设计;
- 对 IO Multiplexing 技术的理解;
- 收发数据包正确的方式,收发缓冲区如何设计;
- 优雅关闭;
- 定时器如何设计;
- epoll 的实现原理;
5. 内存数据库/缓存技术
5.1 Redis
第一层面一般是对 Redis 的基础用法的考察 如考察 Redis 支持的基础数据类型、Redis的数据持久化、事务等。
第二层面不仅考察 Redis 的基础用法,还会深入到 Redis 源码层面上,如 Redis 的网络通信模型、Redis 各种数据结构的实现等等。
Redis 高可用技术、cluster、哨兵策略等。