【C++开发面经】全过程面试问题详解

目录

[1. 智能指针讲解](#1. 智能指针讲解)

[2. 智能指针管理对象的方式](#2. 智能指针管理对象的方式)

[3. 大量使用智能指针的代价](#3. 大量使用智能指针的代价)

[4. 结构体中使用智能指针(用 make_shared/make_unique)](#4. 结构体中使用智能指针(用 make_shared/make_unique))

[5. C++ 头文件和源文件分开写的原因](#5. C++ 头文件和源文件分开写的原因)

[6. 是否只使用过 C++?](#6. 是否只使用过 C++?)

[7. 预处理、编译、链接流程](#7. 预处理、编译、链接流程)

[8. map 和 unordered_map 的区别](#8. map 和 unordered_map 的区别)

[9. vector 扩容机制](#9. vector 扩容机制)

[10. 模板讲解](#10. 模板讲解)

[11. 专业是否学这些语言?](#11. 专业是否学这些语言?)

[12. 愿意转语言吗?](#12. 愿意转语言吗?)

[13. 发展规划 / 方向](#13. 发展规划 / 方向)


1. 智能指针讲解

  • 核心:C++ 基于 RAII 机制的动态内存管理工具,自动释放对象,避免内存泄漏;
  • 种类:unique_ptr(独占所有权)、shared_ptr(引用计数共享)、weak_ptr(解决循环引用,不占计数)。

2. 智能指针管理对象的方式

  • 构造时:获取动态内存(或接管裸指针所有权);
  • 生命周期:unique_ptr 独占,析构直接释放;shared_ptr 维护引用计数,计数为 0 时释放;
  • 析构时:自动调用对象析构函数,释放绑定的内存 / 资源。

3. 大量使用智能指针的代价

  • 内存开销:shared_ptr 需存储引用计数(额外 4/8 字节),weak_ptr 依赖控制块;
  • 性能开销:shared_ptr 计数增减需原子操作(线程安全但有开销);
  • 复杂度:shared_ptr 可能引发循环引用,需配合 weak_ptr 解决;调试成本略高。

4. 结构体中使用智能指针(用 make_shared/make_unique

  • 直接作为成员变量,通过 make_xxx 初始化,避免裸 new,更安全高效:

    struct MyStruct {
    std::unique_ptr<int> up; // 独占所有权
    std::shared_ptrstd::string sp; // 共享所有权
    // 初始化
    MyStruct() : up(std::make_unique<int>(10)), sp(std::make_sharedstd::string("test")) {}
    };

5. C++ 头文件和源文件分开写的原因

  • 分离接口与实现:头文件暴露类 / 函数声明(接口),源文件实现逻辑;
  • 避免重复编译:头文件加防护(#pragma once/ifndef),减少编译开销;
  • 便于模块化:多人协作时,仅需依赖头文件,无需关心实现细节。

6. 是否只使用过 C++?

  • 主用 C++,同时了解 Go/Python(根据自身情况调整),能应对跨语言协作场景。

7. 预处理、编译、链接流程

  • 预处理:处理 #include/#define,删除注释,生成预处理文件(.i);
  • 编译:将预处理文件编译为汇编代码(.s),做语法 / 语义检查、优化;
  • 链接:将多个目标文件(.o)+ 库文件合并,解析符号引用,生成可执行文件。

8. map 和 unordered_map 的区别

  • 底层:map 红黑树(有序,O (logn) 操作),unordered_map 哈希表(无序,平均 O (1));
  • 特性:map 自动排序、支持范围查询,unordered_map 查询更快但无序、有哈希冲突;
  • 适用:map 需有序场景,unordered_map 追求查询效率。

9. vector 扩容机制

  • 扩容时:分配新内存(通常是原容量的 1.5/2 倍),拷贝原数据到新内存,释放旧内存;
  • 影响:扩容有拷贝开销,可提前用 reserve(n) 预留空间,避免频繁扩容。

10. 模板讲解

  • 核心:C++ 泛型编程工具,允许定义 "类型无关" 的类 / 函数,编译期实例化;
  • 分类:函数模板(如 std::sort)、类模板(如 std::vector);
  • 优势:代码复用,支持多种类型,无类型转换开销。

11. 专业是否学这些语言?

  • 专业课程覆盖 C++ 核心,后续通过项目 / 自学深化,同时拓展相关技术栈(根据自身情况调整)。

12. 愿意转语言吗?

  • 愿意!核心能力是编程思维和问题解决,语言是工具,能快速学习 Go/Java 等语言适配工作需求。

13. 发展规划 / 方向

  • 短期:深耕 C++ 后端 / 客户端开发,夯实底层基础(内存、并发、网络);
  • 长期:向技术专家方向发展,聚焦高性能系统 / 中间件开发,积累复杂项目落地经验。
相关推荐
over6972 小时前
从 LLM 到全栈 Agent:MCP 协议 × RAG 技术如何重构 AI 的“做事能力”
面试·llm·mcp
心之语歌2 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
SuperEugene3 小时前
Vue状态管理扫盲篇:如何设计一个合理的全局状态树 | 用户、权限、字典、布局配置
前端·vue.js·面试
blasit3 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
华仔啊3 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang3 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang5 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Sailing5 小时前
🚀 别再乱写 16px 了!CSS 单位体系已经进入“计算时代”,真正的响应式布局
前端·css·面试
Java水解5 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SuperEugene8 小时前
Vue状态管理扫盲篇:Vuex 到 Pinia | 为什么大家都在迁移?核心用法对比
前端·vue.js·面试