C++ 八股文速通

一、语言本质:C++ 是什么

C++ = 多范式语言支持:

  • 面向过程(C 风格)
  • 面向对象(class / inheritance / polymorphism)
  • 泛型编程(template)
  • 元编程(constexpr / TMP)

核心思想:

零成本抽象(Zero-overhead abstraction)—— 你不用的功能不会带来运行时开销

二、内存模型与对象生命周期

1. 内存分区

典型程序内存布局:

  • 栈(stack):局部变量,自动分配释放
  • 堆(heap):动态分配(new / malloc)
  • 静态区(data / bss):全局变量、static变量
  • 常量区:字符串常量等
  • 代码区(text)

2. new / delete vs malloc / free

类型安全

构造函数

调用

不调用

返回类型

指针类型

void*

重载

可以

不行

本质区别:

new = malloc + 构造函数delete = 析构函数 + free

3. 对象生命周期

顺序:

  1. 分配内存
  2. 构造函数
  3. 使用
  4. 析构函数
  5. 释放内存

三、引用、指针与const

1. 指针 vs 引用

是否可为空

可以

不可以

是否可改指向

可以

不可以

语法

复杂

简洁

本质

地址变量

别名

本质理解:

引用 = 被限制的指针(语法糖)

2. const 的本质

const 修饰的是:

“不可通过该变量修改”

但不代表:

“该值绝对不变”

3. 常见 const 组合

const int *p;      // 指向常量的指针(不能改值)
int *const p;      // 常量指针(不能改指向)
const int *const p;// 都不能改

口诀:

const 看左边,没有看右边

C++面试常考题目类型都放入了专栏了:https://www.nowcoder.com/creation/manager/columnDetail/Mq7XWW

四、拷贝控制(核心高频)

1. 三/五法则

  • 析构函数
  • 拷贝构造
  • 拷贝赋值

C++11 扩展为:

  • 移动构造
  • 移动赋值

2. 深拷贝 vs 浅拷贝

浅拷贝:

this->ptr = other.ptr;

深拷贝:

this->ptr = new int(*other.ptr);

问题:

浅拷贝会导致 double free

3. 移动语义(重点)

核心:

“偷资源,而不是复制”

A(A&& other) {
    ptr = other.ptr;
    other.ptr = nullptr;
}

4. std::move 本质

std::move(x)

本质:

强制转换为右值引用(并不移动)

五、右值引用与完美转发

1. 左值 vs 右值

左值

可取地址

右值

临时对象

2. 右值引用

int&& x = 10;

意义:

绑定临时对象,实现移动语义

3. 万能引用(forwarding reference)

template<typename T>
void func(T&& t);

规则:

  • 传左值 → T& → 折叠为 T&
  • 传右值 → T&&

4. 完美转发

std::forward<T>(t)

作用:

保留原始值类别(左/右)

六、虚函数与多态

1. 多态条件

  • 基类指针/引用
  • 虚函数
  • 运行时绑定

2. 虚函数表(vtable)

对象结构:

[ vptr ] -> vtable

调用过程:

  1. 通过 vptr 找 vtable
  2. 查函数地址
  3. 调用

3. 构造/析构中的虚函数

规则:

构造/析构期间不会发生多态

原因:

对象还未完整构造 / 已部分销毁

4. 纯虚函数

virtual void func() = 0;

作用:

  • 定义接口
  • 强制派生类实现

七、继承与对象模型

1. 继承方式

public

public

protected

protected

protected

protected

private

private

private

2. 多继承问题

  • 二义性
  • 菱形继承

解决:

virtual inheritance

3. 虚继承本质

引入共享基类指针(vbptr)

八、模板与泛型编程

1. 模板本质

编译期代码生成(不是函数)

2. 模板实例化

  • 隐式实例化
  • 显式实例化

3. 模板特化

template<>
class A<int> {};

4. SFINAE

Substitution Failure Is Not An Error

用于:

  • 类型判断
  • 编译期分支

九、STL 核心原理

1. 容器分类

  • 顺序容器:vector / list / deque
  • 关联容器:set / map
  • 无序容器:unordered_map

2. vector 扩容机制

  • 容量翻倍(通常 1.5~2 倍)
  • 重新分配内存
  • 触发拷贝/移动

3. map vs unordered_map

结构

红黑树

哈希表

复杂度

O(log n)

平均 O(1)

有序

4. 迭代器失效

典型:

  • vector 扩容 → 全部失效
  • list 插入 → 不失效
  • map 插入 → 不失效

十、智能指针(必考)

1. unique_ptr

  • 独占所有权
  • 不可拷贝,可移动

2. shared_ptr

  • 引用计数
  • 多个指针共享

问题:

循环引用 → 内存泄漏

3. weak_ptr

  • 不增加引用计数
  • 用于解决循环引用

十一、并发与线程

1. 线程创建

std::thread t(func);

2. 线程同步

  • mutex
  • lock_guard
  • unique_lock

3. 死锁条件

  • 互斥
  • 请求与保持
  • 不可剥夺
  • 循环等待

4. 原子操作

std::atomic<int>

保证:

无锁线程安全

十二、编译与链接

1. 编译过程

  1. 预处理
  2. 编译
  3. 汇编
  4. 链接

2. 头文件问题

  • include 只是文本替换
  • 需要 include guard / pragma once

3. inline 本质

建议编译器内联(不保证)

十三、常见面试陷阱

1. delete this

危险:

对象必须是 new 出来的

2. 野指针

未初始化 / 已释放

3. 内存泄漏

典型:

  • new 没 delete
  • 循环引用 shared_ptr

4. 未定义行为(UB)

  • 越界访问
  • 使用悬空引用
  • 修改 const

总结(面试核心抓手)

真正高频考点可以压缩为 6 个核心:

  1. 对象模型(构造 / 析构 / 拷贝 / 移动)
  2. 内存管理(new/delete/智能指针)
  3. 多态(虚函数/vtable)
  4. 模板(泛型 + SFINAE)
  5. STL 原理(vector/map)
  6. 并发(mutex/atomic)

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务