【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++ 后端 / 客户端开发,夯实底层基础(内存、并发、网络);
  • 长期:向技术专家方向发展,聚焦高性能系统 / 中间件开发,积累复杂项目落地经验。
相关推荐
李子园的李1 天前
Java函数式接口——渐进式学习
java
yaoh.wang1 天前
力扣(LeetCode) 66: 加一 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
running up1 天前
Spring Bean生命周期- BeanDefinition 加载与 BeanFactoryPostProcessor BeanPostProcessor
java·后端·spring
222you1 天前
Java线程的三种创建方式
java·开发语言
脸大是真的好~1 天前
计算机408基础相关面试题-备用,不推荐
java
小费的部落1 天前
Excel 在Sheet3中 匹配Sheet1的A列和Sheet2的A列并处理空内容
java·前端·excel
咘噜biu1 天前
多租户动态数据源插件dynamic-datasource简介
java·mybatisplus·动态数据源·多租户
漫漫求1 天前
Java内存模型【JMM】、JVM内存模型
java·开发语言·jvm
原来是好奇心1 天前
深入Spring Boot源码(五):外部化配置与Profile机制深度解析
java·源码·springboot
IT界的奇葩1 天前
OAuth2 单点登录流程图
java·流程图·oauth2·单点登录·sso