2021年秋季招聘接近尾声,也是时候整理一些自己的面试问题总结了。在7月中旬到9月末开始,陆续整理了以下C++后端岗位的面试问题。
关于来源:
标注【牛客】的部分题目来自牛客上的面试题目,安利一下牛客的秋招集训营,很全面很高效
标注【拓跋阿秀】的问题来自同名公众号,这是阿秀大佬整理的问题
标注【Guide】的问题来自javaguide,这也是大佬整理的问题
注意:本博客仅涉及面试问题的题目,对于题目的具体解答请去上面提到的源头查看,也可自行百度解决
1.1.1 C++语言的特点
1.1.2 C语言和C++的区别
1.1.3 C++中struct和class的区别
1.1.4 include头文件的顺序,""和<>的区别
1.1.5 C++和C结构体的区别
1.1.6 导入C函数的关键字,C++的编译和C有什么不同
1.1.7 C++从代码到可执行二进制文件的过程(预处理、编译、汇编、链接)
1.1.8 static关键字
1.1.9 数组和指针的区别(char数组初始化、指针初始化)
1.1.10 函数指针
1.1.11 静态变量什么时候初始化
1.1.12 nullptr可以调用成员函数么
1.1.13 野指针
1.1.14 静态局部变量 全局变量 局部变量
1.1.15 内联函数和宏的区别(使用inline的注意事项、使用inline的条件)
1.1.16 运算符i++和++i的区别
1.1.17 new和malloc的区别及其实现原理
1.1.18 const和define的区别
1.1.19 C++中函数指针和指针函数的区别
1.1.20/1.1.24 底层const和顶层const
1.1.21 使用指针的注意事项
1.1.22 内联函数和函数的区别
1.1.23 C++传值方式
1.2.1 堆和栈的区别
1.2.2 C++内存管理(内存分区、内存错误、内存泄漏、检测内存泄漏的方法)
1.2.3 malloc和局部变量分配在堆还是栈上
1.2.4 虚拟地址空间分区,各自作用,程序启动的过程(main函数执行前的工作),判断数据在栈还是堆上
1.2.5 初始化为0的全局变量存放在bss段还是data段
1.2.6 什么是内存泄漏,怎么检测内存泄漏
1.2.10 C++内存对齐(什么是、为什么、怎么) ,#pragma pack
1.3.1 什么是面向对象
1.3.2 面向对象的三大特征
1.3.3 C++重载和重写的区别
1.3.4 重载和重写是如何实现的
1.3.5 C如何实现C++中的重载
1.3.6 构造函数有几种(默认构造、初始化构造、拷贝构造、移动构造)
1.3.7 只定义析构函数,会自动生成哪些构造函数;拷贝构造为什么必须传引用
1.3.8 一个类会默认生成哪些函数
1.3.9 C++类对象的初始化顺序(构造函数的初始化过程),有多继承情况下
1.3.10 向下转型,向上转型
1.3.11 深拷贝,浅拷贝(代码实现)
1.3.12 协变
1.3.13 为什么要虚析构,不能虚构造
1.3.14 模板类在什么时候实现的
1.3.15 类继承时,派生类对不同关键字修饰的基类方法的访问权限(public、protected、private)
1.3.16 移动构造函数,移动赋值运算符(代码)
1.3.17 C++类内可以定义引用数据成员么
1.3.19 什么是常函数,有什么用
1.3.20 虚继承
1.3.21 虚函数和纯虚函数,实现原理
1.3.22 纯虚函数能实例化么,为什么
1.3.23 虚函数与纯虚函数的区别
1.3.24 菱形继承问题
1.3.25 构造函数中能不能调用虚函数
1.3.26 拷贝构造函数的参数是什么传递方式,换别的行不行
1.3.27 类方法和数据的访问权限
1.3.28 抽象类怎样理解
1.3.29 除了虚函数,还有什么方式能实现多态
1.3.30 虚析构函数的作用
1.3.31 虚基类,是否可以实例化
1.3.32 拷贝赋值和移动赋值
1.3.33 仿函数是什么,有什么用
1.3.34 C++中什么函数不能声明为虚函数
1.3.35 C++中类模板和模板类的区别
1.3.36 虚函数的表中的内容是什么时候写进去的
1.4.1 STL的基本组成部分
1.4.2 STL中的常见容器(vector、deque、list、set、map、stack、queue、priority_queue)及其实现原理
1.4.3 STL中map、hashtable、deque和list的实现原理
1.4.4 STL的空间配置器allocator(内存分配的三种形式,两级配置器)
1.4.5 STL容器查找、插入、删除的时间复杂度
1.4.6 迭代器的失效情况
1.4.7 迭代器的作用,有了指针为什么还要用迭代器
1.4.8 迭代器是怎么删除元素的(迭代器分类)
1.4.9 resize和reverse的区别
1.4.10 STL容器动态链接可能产生的问题
1.4.11 map和unordered_map的区别,底层实现
1.4.12 vector和list的区别,分别适用于什么场景
1.4.13 vector的实现原理
1.4.14 map的实现原理
1.4.15 vector和list删除元素(末尾/中间),迭代器怎么变化
1.4.16 map和set的区别,底层实现
1.4.17 push_back和emplace_back的区别
1.5.1 C++11的新特性
1.5.2 智能指针和指针的区别
1.5.3 智能指针有哪些,分别解决了什么问题
1.5.4 C++右值引用与转移语义
1.5.5 unique_ptr、shared_ptr的实现原理
1.5.6 weak_ptr能不能知道对象计数为0
1.5.7 weak_ptr怎样解决shared_ptr的循环引用问题
1.5.8 shared_ptr怎么知道跟他共享对象的指针释放
1.5.9 shared_ptr的线程安全性原理
1.5.10 智能指针有没有内存泄漏的情况
1.5.11 C++11中的四种类型转换const_cast 、static_cast、 reinterpreter_cast、dynamic_cast
1.5.12 auto 与const结合使用
1.5.13 可变参数模板新特
1.5.14 Lambda新特性,匿名函数
2.1 Linux查看进程运行状态的命令、查看内存使用情况的命令、tar解压文件的参数
2.2 修改文件权限
2.3 常用的Linux命令
2.4 怎样以root权限运行某个程序
2.5 软链接和硬链接的的区别
2.6 静态库和动态库
2.7 GDB调试命令,条件断点,多进程调试
2.8 大端字节序和小端字节序
2.9/2.30 进程调度算法
2.10 操作系统如何申请、管理内存
2.11 Linux系统态与用户态(进入内核态的三种方式)
2.12 LRU算法及其实现
2.13 一个线程占多大内存
2.14 什么是页表,为什么要有
2.15 缺页中断
2.16/2.21 虚拟内存/进程空间分布,什么时候会由用户态进入内核态
2.17 虚拟内存和物理内存,为什么要用虚拟内存,使用虚拟内存的好处和坏处
2.18 虚拟地址到物理地址是怎么映射的
2.19 堆栈溢出(内存溢出)
2.20 malloc的实现原理
2.22 32位系统能访问4GB以上的内存么
2.23 并发和并行
2.24 进程、线程和协程
2.25 Linux的fork
2.26 孤儿进程、僵尸进程,怎样解决僵尸进程
2.27 守护进程,如何实现
2.28 进程通信方式
2.29 进程同步的方式
2.31 进程状态
2.32 进程通信中管道的实现原理
2.33 mmap的原理和使用场景
2.34 互斥量能不能在进程中使用
2.35 协程是轻量级线程,轻量级表现在哪里
2.36 常见信号
2.37 线程通信方式
2.38 线程同步方式
2.39 死锁,产生条件,如何解决
2.40 有了进程,为什么还要有线程
2.41 单核机器上写多线程程序,是否要加锁
2.42 多线程和多进程的不同
2.43 互斥锁,读写锁
2.44 信号量
2.45 进程、线程中断切换的过程(上下文切换)
2.46 互斥锁和自旋锁的使用场景
2.47 线程状态转换
2.48 多线程和单线程有什么区别
2.49 sleep和wait的区别
2.50 线程池的设计思路
2.51 进程和线程比为什么慢
2.52 Linux零拷贝
2.53 epoll和select的区别,epoll的高效性
2.54 多路IO复用技术,及其区别
2.55 select和epoll的使用场景和区别,epoll水平触发与边缘触发
2.56 Reactor和Proactor模式
2.57 同步和异步,阻塞和非阻塞
2.58 BIO和NIO
2.59 同步和异步的区别
2.60 socket网络编程中client和server用到了哪些函数
3.1 静态路由和动态路由
3.2 常见路由协议
3.3 域名解析过程,本机如何干预
3.4 DNS查询服务器的流程,DNS劫持
3.5 网关作用,同一网段主机怎样通信(ARP协议工作原理)
3.6 CSRF攻击
3.7 MAC地址和IP地址
3.8/3.11 TCP三次握手和四次挥手
3.9 TCP为什么不能两次握手
3.10/3.25 TCP和UDP的区别,头部结构
3.12 TCP连接和关闭的状态转移
3.13 TCP慢启动
3.14 TCP怎样保证有序
3.15 TCP的常见拥塞控制算法
3.16 TCP超时重传
3.17 TCP怎样保证可靠性
3.18 TCP滑动窗口和重传机制
3.19 滑动窗口过小
3.20 三次握手中每次握手的信息没有被对方收到会怎样
3.21 为什么要有TIME_WAIT
3.22 什么是MSL,为什么客户端要等待2MSL才能完全关闭
3.23 什么是SYN flood,怎样防止
3.24 TCP粘包和拆包
3.26 从系统层面上,UDP怎样保证尽量可靠
3.27 TCP的keepalive和HTTP的keepalive
3.28 TCP的延迟ACK和累积应答
3.29 TCP怎样加速大文件的擦户数
3.30 服务器怎样判断客户端断开了连接
3.31 端到端,点到点的区别
3.32 浏览器从输入URL到展现页面的全过程
3.33 HTTP和HTTPS的区别
3.34 HTTP中的referer头的作用
3.35 HTTP的请求方法
3.36 HTTP1.0/1.1/2.0的区别
3.37 HTTP常见响应状态码及其含义(200 301 302 400 403 404 500 503)
3.38 GET请求和POST请求的区别
3.39 Cookie和Session的关系和区别
3.40 HTTPS的加密与认证过程(浏览器验证证书的过程)
4.1.1 数据库分页
4.1.2 MySQL聚合函数
4.1.3 表与表之间的关联 join(inner join outer join)
4.1.4/4.1.5 外连接
4.1.6 SQL中将行转为列
4.1.7 SQL注入
4.1.8 将一张表的部分数据更新到另一张表
4.1.9 where和having的区别
4.2.1 索引
4.2.2 索引有几种
4.2.3 怎样创建保存MySQL索引
4.2.4 判断要不要加索引
4.2.5 只要创建索引,就一定会走索引么
4.2.6 怎样判断索引是否生效
4.2.7/4.2.10 怎样合理创建索引/所有字段都适合创建索引么
4.2.8 索引越多越好么
4.2.9 避免索引失效
4.2.11 索引的实现原理
4.2.12 索引重构
4.2.13 MySQL索引为什么用B+树
4.2.14/4.2.17 联合索引的存储结构
4.2.15 Hash索引和B树索引的区别
4.2.16 聚簇索引和非聚簇索引的区别
4.2.18 select in怎样使用索引
4.2.19 模糊查询中怎样使用索引
4.3.1/4.3.2 事务,事务分类
4.3.3 ACID特性的实现原理
4.3.4 MySQL的事务隔离级别
4.3.5 事务隔离级别怎样实现
4.3.6 事务可以嵌套么
4.3.7 怎样实现可重复读 MVCC见4.3.3
4.3.8 怎样解决幻读
4.3.9 MySQL怎样实现回滚
4.4.1 数据库的锁(共享锁/排他锁 意向锁 行锁算法 死锁)
4.4.2 间隙锁
4.4.3 InnoDB中行级锁怎样实现
4.4.4 数据库死锁
4.4.5 死锁的解决办法
4.5.1 数据库优化
4.5.2 怎样优化MySQL的查询
4.5.3 怎样优化数据插入
4.5.4 表中含有几千万条数据怎么办
4.5.5 怎样优化慢查询
4.5.6/4.5.7 explain,关注什么
4.6.1 数据库三大范式
4.6.2 MySQL引擎
4.6.3 redolog undolog binlog
4.6.4 MVCC
4.6.5 MySQL主从同步怎样实现
5.1 单例设计模式(懒汉、饿汉)
5.2 懒汉模式与饿汉模式怎样保证线程安全
5.3 工厂设计模式
补1-关系型/非关系型数据库的区别
补2-什么是非关系型数据库
1.1 什么是操作系统
1.2 什么是系统调用
2.1 进程和线程的区别
2.2 进程的状态(运行态、就绪态、阻塞态)
2.3 进程通信方式
2.4 线程同步的方式
2.5 进程调度算法
3.1 内存管理是做什么的
3.2 内存管理机制(页式、段式、段页式)
3.3 快表和多级页表
3.4 分页机制和分段机制的异同
3.5 逻辑地址(虚拟地址)和物理地址
3.6 CPU寻址,为什么需要虚拟地址空间
4.1 什么是虚拟内存
4.2 局部性原理
4.3 虚拟存储器
4.4 虚拟内存的技术实现(请求分页、请求分段、请求段页式)
4.5 页面置换算法
3.1.1 OSI七层、TCP/IP四层、五层网络的结构与功能,都有什么协议
3.1.2 TCP三次握手、四次挥手
3.1.2 TCP、UDP的区别
3.1.3 TCP怎样保证可靠传输
3.1.4 ARQ协议
3.1.5 滑动窗口和流量控制
3.1.6 拥塞控制
3.1.7 打开一个网页的过程(输入URL地址到显示主页)
3.1.8 状态码
3.1.9 HTTP协议与其他协议的关系
3.1.10 HTTP长连接,短连接
3.1.11 HTTP不保存状态,怎样保存用户状态
3.1.12 cookie的作用是什么,与session的区别
3.1.13 HTTP1.0和1.1的区别
3.1.12 URI和URL的区别
3.1.13 HTTP和HTTPS的区别
4.1.3 MyISAM和InnoDB的区别
4.1.5 MyISAM和InnoDB的B+树有什么区别
4.1.6 查询缓存的使用
4.1.7 事务
4.1.8 事务的四大特性(ACID)
4.1.9 并发事务带来哪些问题(脏读、丢失修改、不可重复读、幻读)
4.1.10 事务隔离级别(读未提交、读提交、可重复读、串行化)
4.1.11 表锁、行锁、行锁的算法(Record lock / Gap lock / Next-key lock)
4.1.12 大表优化
4.1.13 池化设计思想,数据库连接池
4.1.14 分库分表以后,id主键如何处理
4.1.15 一条SQL语句在MySQL中怎样执行
4.1.16 MySQL高性能优化
4.1.17 SQL语句执行很慢的原因