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两种数据引擎的区别

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、哨兵策略等。