跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 面试核心知识点总结:语法、内存与 STL

C++ 面试核心考点涵盖语法基础、内存管理、STL 容器及类特性。重点包括变量生命周期、指针与引用的区别、智能指针原理、RAII 机制、堆栈内存分布、STL 容器选择策略、虚函数实现机制以及版本控制命令。掌握这些概念有助于应对技术面试中的常见考点,提升代码质量与系统稳定性。

云朵棉花糖发布于 2026/3/15更新于 2026/5/2116 浏览
C++ 面试核心知识点总结:语法、内存与 STL

C++ 面试核心知识点总结

本文梳理了 C++ 岗位面试中高频出现的考点,涵盖语法基础、STL 标准库、内存管理、类特性及相关工具。掌握这些内容,基本能应对大部分技术面试的考察。

一、C++ 语法基础

变量的使用和生命周期

全局变量在程序任何地方可访问,生命周期贯穿整个程序;局部变量定义在函数或代码块内,仅在该作用域有效;静态变量通过 static 声明,生命周期延长至程序结束但作用域受限。

变量类型声明方式存储位置作用域生命周期
全局变量函数外部声明常量区(静态存储区)整个文件全局
局部变量函数或代码块内栈区函数内部函数调用期间
静态全局加 static 关键字常量区(静态存储区)整个文件全局
静态局部加 static 关键字常量区(静态存储区)函数内部全局(值持久化)

命名空间的作用

命名空间主要用于避免命名冲突,将相关函数和类封装在一起,提高代码的组织性和可读性。例如:

namespace MyNamespace { int x; void func(); }

标准命名空间通常需加 std:: 前缀或使用 using namespace std;。

include "" 和 <> 的区别

  • #include <文件名>:包含标准库头文件,编译器按标准路径搜索。
  • #include "文件名":包含用户自定义或项目内部头文件,优先在当前目录查找。

指针与引用

指针是存储变量地址的特殊数据类型,可通过解引用操作符 * 访问数据。

int *ptr = &x; // ptr 存储 x 的地址

引用是变量的别名,使用 & 符号定义,必须在定义时初始化且不可更改绑定对象。

int num = 10;
int &ref = num; // ref 是 num 的别名

区别:引用不能为空,无需解引用;指针可以为空,需要解引用;引用必须初始化,指针可以后续赋值。

指针数组与数组指针

  • 指针数组:元素为指针的数组,如 int *ptrArray[5];。
  • 数组指针:指向数组的指针,如 int (*arrPtr)[5];。

函数指针与指针函数

  • 函数指针:指向函数的指针变量,用于动态调用函数。
  • 指针函数:返回类型为函数指针的函数。

常量指针与指针常量

  • 常量指针 (int* const ptr):指针本身是常量,指向不可变,但指向的对象值可变。
  • 指针常量 (const int* ptr):指向的对象是常量,指针指向可变,但对象值不可变。

智能指针的本质

智能指针利用 RAII 机制管理动态内存,通过析构函数自动释放资源。常见类型包括 std::shared_ptr(共享所有权)、std::unique_ptr(独占所有权)和 std::weak_ptr(解决循环引用)。weak_ptr 不增加引用计数,依赖 shared_ptr 管理资源。

类型强制转换

主要有四种:static_cast、const_cast、dynamic_cast、reinterpret_cast。

函数参数传递

  • 值传递:复制实参,不影响原始值。
  • 引用传递:别名,影响原始值。
  • 指针传递:传递地址,通过解引用影响原始值。

进程与线程通信

  • 进程间:管道、消息队列、共享内存、信号量、套接字等。
  • 线程间:共享内存、互斥锁、条件变量等。
  • 线程共享资源处理:需注意数据一致性,常用互斥锁避免竞争。

常用关键字

  • static:控制变量生命周期或函数作用域。
  • const:声明常量或成员函数不修改对象状态。
  • sizeof:计算类型或变量字节大小。
  • final/override:C++11 引入,控制继承和重写行为。
  • virtual:声明虚函数支持多态。
  • volatile:防止编译器优化易变变量。
  • explicit:禁止隐式类型转换。
  • inline:建议编译器内联展开函数。

class 和 struct 的区别

主要区别在于默认访问权限:class 默认为 private,struct 默认为 public。保留 struct 主要是为了向后兼容和语法灵活性。

二、标准库

什么是 STL?

STL(Standard Template Library)提供通用模板类和函数,包括容器、算法、迭代器、函数对象和适配器。

数组和 vector 的区别

  • 大小:数组固定,vector 动态可变。
  • 内存:数组可在栈或堆,vector 通常在堆上动态分配。
  • 功能:vector 支持动态扩展和内置操作。

list 和 vector 的区别

  • 存储:list 是双向链表,vector 是动态数组。
  • 访问:vector 支持随机访问,list 不支持。
  • 插入删除:list 在中间插入删除效率高,vector 适合末尾操作。

set 与 map

  • set:底层通常为红黑树,元素唯一且有序,操作复杂度 O(log n)。
  • map:键值对映射,同样基于红黑树。
  • unordered_map:基于哈希表,平均 O(1) 查找,无序。

三、内存

RAII 是什么?

资源获取即初始化(Resource Acquisition Is Initialization),将资源的生命周期绑定到对象上,构造函数获取资源,析构函数释放资源。

new 和 malloc 的区别

  • new:C++ 操作符,分配内存并调用构造函数,返回具体类型指针。
  • malloc:C 库函数,仅分配内存,返回 void*,不调用构造函数。
  • delete/free:对应释放,delete 调用析构函数,free 不会。

内存框架分布

  • 栈:局部变量、函数调用信息。
  • 堆:动态分配内存。
  • 静态存储区:全局变量、静态变量。
  • 常量区:字符串常量等。

堆和栈的区别

栈自动管理,速度快但空间小;堆手动管理,速度慢但空间大。

内存对齐

将数据地址按特定边界排列,提高访问效率并防止硬件异常。

内存泄漏与防止

未释放动态分配的内存导致资源浪费。防止方法包括使用 RAII、智能指针、内存分析工具及良好的编码习惯。

深拷贝和浅拷贝

  • 浅拷贝:只复制指针值,共享资源。
  • 深拷贝:创建资源的完整副本,独立管理。

四、类相关

C++ 三大特性

  • 封装:隐藏实现细节。
  • 继承:复用父类属性和行为。
  • 多态:同一接口不同实现。

多态的实现

依赖虚函数和动态绑定,通过虚函数表(vtable)和虚指针(vptr)在运行时决定调用哪个函数。

虚函数与纯虚函数

  • 虚函数:基类中声明为 virtual,允许派生类重写。
  • 纯虚函数:= 0 声明,使基类成为抽象类,必须被实现。

构造函数与析构函数

  • 构造函数:初始化对象,无返回值,可重载。
  • 析构函数:清理资源,无返回值,不可重载,可声明为虚函数以确保正确销毁。

this 指针

指向当前对象的指针,用于区分成员变量和参数,支持链式调用。

五、其他必备

Git 常用命令

  • git clone:克隆仓库。
  • git add / commit:暂存与提交。
  • git status / diff:查看状态与差异。
  • git pull / push:拉取与推送。

Git 与 SVN 的区别

Git 是分布式版本控制系统,SVN 是集中式。Git 更适合代码协作,SVN 常用于文档管理。

Linux 常用命令

  • ls, cd, pwd:目录操作。
  • cp, mv, rm:文件操作。
  • chmod, chown:权限管理。
  • ps, top, kill:进程管理。
  • netstat, ping:网络诊断。

目录

  1. C++ 面试核心知识点总结
  2. 一、C++ 语法基础
  3. 变量的使用和生命周期
  4. 命名空间的作用
  5. include "" 和 <> 的区别
  6. 指针与引用
  7. 指针数组与数组指针
  8. 函数指针与指针函数
  9. 常量指针与指针常量
  10. 智能指针的本质
  11. 类型强制转换
  12. 函数参数传递
  13. 进程与线程通信
  14. 常用关键字
  15. class 和 struct 的区别
  16. 二、标准库
  17. 什么是 STL?
  18. 数组和 vector 的区别
  19. list 和 vector 的区别
  20. set 与 map
  21. 三、内存
  22. RAII 是什么?
  23. new 和 malloc 的区别
  24. 内存框架分布
  25. 堆和栈的区别
  26. 内存对齐
  27. 内存泄漏与防止
  28. 深拷贝和浅拷贝
  29. 四、类相关
  30. C++ 三大特性
  31. 多态的实现
  32. 虚函数与纯虚函数
  33. 构造函数与析构函数
  34. this 指针
  35. 五、其他必备
  36. Git 常用命令
  37. Git 与 SVN 的区别
  38. Linux 常用命令
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 对话平台前端开发实战:从零构建聊天界面
  • 使用 Unity 和 AI 零代码制作小游戏实战
  • OpenClaw 开源 AI Agent 框架:自托管与无代码实战指南
  • 基于视觉的增强现实特效技术详解
  • 使用 GitHub Copilot 配合 Figma MCP 还原设计稿生成代码
  • Playwright 现代 Web 自动化测试入门与实战
  • KDTS 工具实现 MySQL 至 KingbaseES 数据迁移实战
  • 医疗 AI 可信革命全栈实现:向量索引与贝叶斯网络
  • AI 写作发展趋势与展望
  • Rust WebAssembly 开发实战:构建高性能前端应用
  • 鸿蒙金融理财全栈项目:运维监控、性能优化与安全加固
  • GitHub Copilot 接入 Figma MCP 实现设计稿转前端代码
  • MongoDB 哈希索引实战:分布式数据均匀分布策略
  • Rust WebAssembly开发实战:构建高性能前端应用
  • Go 项目中使用 Casbin 实现 RBAC 权限管理
  • VSCode Copilot 插件卡顿问题解决方案
  • Rust WebAssembly 开发实战:构建高性能前端应用
  • OpenClaw 本地部署与 cpolar 公网访问配置指南
  • AI 产品经理面试指南:100 道经典问题与核心知识点解析
  • 基于 4x Tesla P40 的 Llama-3.3-70B 大模型训练实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online