乐途乐途
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
  • C++ 学习路径
  • 第1章 C++概述与开发环境

    • C++ 语言概述与编译模型
    • 第一个 C++ 程序与规范
    • 开发环境配置
    • 预处理指令详解
  • 第2章 基本语法与类型系统

    • 变量与基本类型
    • 类型转换
    • 枚举类型
    • 引用与指针
    • 数组与 stdarray
    • 字符串与原始字符串字面量
    • const 与 constexpr
    • nullptr 与空指针
    • 类型推导 auto 与 decltype
    • 基于范围的 for 循环
    • 值类别全面解析
    • char16_t 与 char32_t
    • static_assert 编译期断言
  • 第3章 函数与重载

    • 函数声明与定义
    • 函数重载
    • 默认参数与内联函数
    • Lambda 表达式
    • 函数对象与 stdfunction
    • 后置返回类型与 noexcept
  • 第4章 类与对象

    • 类的基本定义
    • 构造函数与析构函数
    • 拷贝控制
    • 移动构造函数与移动赋值
    • 列表初始化与类内初始化器
    • 静态成员与嵌套类
    • 友元
    • =default 与 =delete
  • 第5章 继承与多态

    • 继承基础
    • 虚函数与多态
    • 虚函数表与动态绑定原理
    • 虚析构函数
    • 抽象类与纯虚函数
    • 多重继承与虚继承
    • 继承构造函数
  • 第6章 运算符重载

    • 运算符重载基础
    • 算术与关系运算符重载
    • 赋值与移动运算符重载
    • 特殊运算符重载
  • 第7章 模板与泛型编程

    • 函数模板
    • 类模板
    • 模板特化与偏特化
    • 可变参数模板
    • 别名模板与模板模板参数
    • SFINAE 与类型萃取
    • 依赖名与 typename/template 关键字
  • 第8章 异常处理

    • 异常处理机制
    • noexcept 与异常安全
    • RAII 与异常安全实践
  • 第9章 内存管理与智能指针

    • 动态内存与内存分区
    • RAII 惯用法
    • unique_ptr
    • shared_ptr 与 weak_ptr
    • 内存管理最佳实践
  • 第10章 右值引用与移动语义

    • 右值引用与值类别深度解析
    • std::move 原理与使用
    • 完美转发与 std::forward
    • 移动语义性能对比与最佳实践
  • 第11章 STL容器

    • vector 深度剖析
    • deque 内部机制
    • list 与 forward_list
    • map 与 set 深度解析
    • unordered 容器与哈希原理
    • array 与 tuple
    • 容器适配器
    • 容器选择全景指南
  • 第12章 STL算法与迭代器

    • 迭代器体系全解
    • 非变异算法
    • 变异算法
    • 排序与二分算法
    • Lambda 与算法组合
    • std::random 随机数库
    • 自定义迭代器开发
  • 第13章 IO流与文件

    • 标准 IO 流
    • 格式化输出控制
    • 文件流操作
    • 字符串流
    • std::regex 正则表达式
  • 第14章 并发与多线程

    • thread 基础与线程管理
    • mutex 与 lock_guard
    • unique_lock 与 condition_variable
    • thread_local 线程局部存储
    • atomic 与内存序
    • future 与 async 异步编程
    • std::chrono 时间库
  • 第15章 现代C++新特性

    • 从 C++11 到 C++20 演进路线
    • C++14 关键新特性
    • C++17 关键新特性
    • C++20 核心特性速览
  • 第16章 面试考点与最佳实践

    • C++ 综合最佳实践清单
    • 高频面试题精讲
    • 多线程面试题与实战
    • 内存管理常见陷阱与排查
  • 附录

    • C++ 核心知识点
    • C++ 专业术语

C++ 核心知识点

本文档基于 ISO C++11 标准(n3337),系统梳理 C++ 语言核心与标准库的关键知识点。


一、C++ 语言概述

1.1 语言定位

C++ 是一种基于 C 的通用编程语言。在 C 的基础上,C++ 增加了类、模板、异常、命名空间、运算符重载、函数重载、引用、自由存储管理运算符以及额外的标准库设施。

1.2 编译模型

  • 翻译单元:源文件 + #include 头文件 - 条件排除代码
  • 翻译阶段(9 个):字符映射 → 行拼接 → 预处理分词 → 预处理执行 → 字面量 → 字符串拼接 → 编译 → 模板实例化 → 链接
  • ODR(单一定义规则):每个翻译单元内实体最多一个定义;整个程序中非内联实体最多一个定义

1.3 实现合规性

  • 可诊断规则:除标注 "no diagnostic is required" 的规则外,所有语法和语义规则均需诊断
  • 两类实现:hosted(托管)和 freestanding(独立)

二、C++ 内存与对象模型

2.1 内存模型

概念要点
字节(byte)基本存储单元,至少容纳基本字符集和 UTF-8 码元
内存位置(memory location)标量类型对象或连续非零宽度位域的最大序列
数据竞争(data race)两求值中一个修改、另一个访问同一内存位置 → 未定义行为

2.2 对象模型

概念要点
对象(object)存储区域,由定义 / new 表达式 / 实现创建
子对象(subobject)成员子对象、基类子对象或数组元素
完整对象(complete object)不是子对象的对象
多态对象声明或继承虚函数的类的对象

2.3 存储期

存储期关键字生命周期
静态static / 命名空间作用域程序启动至结束
线程(C++11)thread_local线程创建至销毁
自动块作用域默认进入作用域至退出
动态new / delete手动管理

三、类型系统

3.1 基础类型

类别类型说明
整型bool, char, short, int, long, long long(C++11)long long 至少 64 位
字符char, wchar_t, char16_t, char32_tC++11 新增 char16_t / char32_t(UTF-16 / UTF-32)
浮点float, double, long doubleIEEE 754 兼容
空类型void无值类型
空指针std::nullptr_tC++11 引入,nullptr 的类型

3.2 复合类型

类型要点
引用左值引用 T&,右值引用 T&&(C++11)
指针T*,包括指向成员的指针 T C::*
数组T[N],C++11 引入 std::array<T, N> 封装
函数函数类型由返回类型和参数类型列表组成

3.3 cv 限定符

限定符语义
const不可修改
volatile禁止编译器优化,每次访问均从内存读取
const volatile两者同时适用

3.4 值类别(C++11 重定义)

           expression
          /          \
      glvalue        rvalue
     /      \       /      \
 lvalue     xvalue        prvalue
  • lvalue:有身份,不可移动
  • xvalue:有身份,可移动(将亡值)
  • prvalue:无身份,纯右值
  • glvalue = lvalue ∪ xvalue
  • rvalue = prvalue ∪ xvalue

四、标准转换

转换类型说明
左值到右值(lvalue-to-rvalue)从 glvalue 读取值
数组到指针(array-to-pointer)T[N] → T*
函数到指针(function-to-pointer)函数类型 → 函数指针
整型提升(integral promotion)小整型提升为 int / unsigned int
浮点提升float → double
整型转换 / 浮点转换 / 浮点 - 整型转换不同类型之间转换
指针转换T* → void*、派生类指针 → 基类指针、nullptr_t → 任意指针
布尔转换算术类型 / 指针 → bool
限定转换添加 cv 限定符

五、表达式

5.1 运算符优先级(从高到低)

优先级运算符结合性
1::左
2() [] -> . ++ --(后置)typeid const_cast dynamic_cast reinterpret_cast static_cast左
3++ --(前置)+ -(一元)! ~ *(解引用)&(取地址)sizeof alignof new delete noexcept右
4.* ->*左
5* / %左
6+ -(二元)左
7<< >>左
8< <= > >=左
9== !=左
10&(位与)左
11^左
12|左
13&&左
14||左
15?:右
16= += -= 等右
17throw右
18,左

5.2 求值顺序

  • 完整表达式之间:先序(sequenced before)
  • 运算符操作数之间:默认无序(unsequenced),同标量对象的无序读写 → 未定义行为
  • 函数调用:实参求值先序于函数体执行,实参间无序
  • 短路求值:&& 和 || 左操作数先序于右操作数
  • 条件运算符:条件先序于两个分支
  • 逗号运算符:左操作数先序于右操作数

5.3 常量表达式(constexpr)

  • 编译期可求值的表达式
  • C++11 引入 constexpr 变量和 constexpr 函数
  • 可用于模板参数、数组边界、枚举值等需编译期常量的场景
  • 限制:函数体必须包含单一 return 语句(C++11 约束,C++14 放宽)

5.4 Lambda 表达式(C++11)

[capture](params) mutable -> Ret { body }
组件说明
capture= 值捕获、& 引用捕获、this、混合捕获
params形参列表,可省略
mutable允许修改值捕获的副本(可选)
-> Ret后置返回类型(可选,可推导)

Lambda 闭包类型是唯一的匿名非联合类类型,带有 operator()。


六、语句

6.1 核心语句速查

语句类型关键字说明
表达式语句expr;以分号结尾的表达式
复合语句{ ... }块
选择语句if, switch条件分支
循环语句while, do-while, for迭代
基于范围的 for(C++11)for (auto& x : container)遍历容器 / 数组
跳转语句break, continue, return, goto控制流转移
声明语句各种声明块内的声明
空语句;无操作

6.2 基于范围的 for 循环

for (for-range-declaration : expression) statement

等价于传统 for 循环使用 begin() 和 end() 的展开形式。


七、函数

7.1 函数声明

特性说明
默认参数声明中从右向左设置默认值,定义中不可重复
内联函数inline 提示编译器在调用点展开
函数重载同作用域同名函数,参数列表不同
constexpr 函数(C++11)隐式 inline,可在编译期求值
noexcept 说明符(C++11)声明函数不抛出异常
后置返回类型(C++11)auto func(args) -> RetType
默认函数(C++11)= default 要求编译器生成默认实现
删除函数(C++11)= delete 禁止使用或生成函数

7.2 函数重载决议

  1. 建立候选函数集
  2. 筛选可行函数(参数数量匹配 + 存在隐式转换序列)
  3. 选择最佳可行函数(最佳转换序列)

7.3 重载运算符

大部分内置运算符可被重载(.、.*、::、?: 除外):

  • 一元:+ - * & ~ ! ++ --
  • 二元:算术、关系、逻辑、位、赋值、下标、函数调用、成员访问、逗号
  • 特殊:new delete new[] delete[]
  • 字面量(C++11):operator "" suffix

八、类

8.1 类基础知识

特性说明
访问控制public、protected、private
成员函数可声明为 static / const / volatile / ref-qualified
静态成员用 static 声明,属于类而非对象
this 指针非静态成员函数的隐式参数
嵌套类类内定义的类

8.2 特殊成员函数

函数说明默认行为
默认构造函数无参或全部有默认值的构造函数逐成员默认初始化
析构函数~ClassName()逐成员析构
拷贝构造函数T(const T&)逐成员拷贝
拷贝赋值T& operator=(const T&)逐成员拷贝赋值
移动构造函数(C++11)T(T&&)逐成员移动
移动赋值(C++11)T& operator=(T&&)逐成员移动赋值

Rule of Five(C++11):如果自定义五者之一,通常应全部显式定义。

8.3 构造函数相关

特性(C++11)说明
委托构造函数构造函数调用同类另一个构造函数
继承构造函数using Base::Base 引入基类构造函数
非静态成员初始化器int x = 0; 或 int x{0}; 直接写在类内
列表初始化统一使用 {} 初始化,禁止窄化转换

8.4 继承

继承方式基类 public 成员基类 protected 成员基类 private 成员
public 继承publicprotected不可访问
protected 继承protectedprotected不可访问
private 继承privateprivate不可访问

8.5 虚函数

特性说明
虚函数virtual 声明,动态分派
纯虚函数= 0,使类成为抽象类
override(C++11)明确标注覆盖,编译器验证
final(C++11)阻止进一步覆盖或继承
虚析构函数基类析构函数应为 virtual
虚函数表(vtable)实现多态的底层机制(实现细节)

九、模板

9.1 模板基础知识

类型语法说明
函数模板template<class T> T f(T a);参数化函数
类模板template<class T> class C {};参数化类
成员模板类模板的成员函数模板嵌套参数化
别名模板(C++11)template<class T> using Vec = std::vector<T>;模板别名

9.2 模板参数

参数种类示例
类型参数template<typename T>
非类型参数template<int N>
模板模板参数template<template<class> class Container>
参数包(C++11)template<typename... Args>

9.3 模板实例化

类型说明
隐式实例化首次使用时自动生成
显式实例化template class C<int>; 强制生成
显式特化template<> class C<int> {}; 完全特化
偏特化类模板部分参数特化(函数模板不支持)

9.4 关键规则

  • 依赖名:依赖于模板参数的名称,前需加 typename 或 template
  • 两阶段查找:非依赖名在模板定义时查找,依赖名在实例化时查找
  • SFINAE:模板参数替换失败不报错,候选集移除该模板
  • 可变参数模板(C++11):支持任意数量模板参数,通过递归或折叠展开

十、C++11 核心新特性速览

10.1 语言核心特性

特性要点
auto从初始化表达式推导类型
decltype获取表达式声明类型
右值引用 T&&移动语义和完美转发的基础
移动语义std::move + 移动构造 / 移动赋值
完美转发std::forward + 转发引用(万能引用)
nullptr类型安全的空指针常量
constexpr编译期常量表达式
Lambda 表达式匿名函数对象
基于范围的 for简洁遍历
enum class限定作用域枚举
static_assert编译期断言
noexcept不抛出异常说明符
= default / = delete显式使用 / 禁止默认函数
override / final虚函数控制
委托构造函数调用同类构造函数
继承构造函数using Base::Base
列表初始化统一 {} 语法
非静态成员初始化器类内直接初始化成员
后置返回类型auto f() -> RetType
可变参数模板typename... Args
别名模板using Alias = ...
外部模板extern template
局部类型作模板实参不再受限
long long至少 64 位整型
char16_t / char32_tUTF-16 / UTF-32 字符类型
原始字符串字面量R"(...)"
用户定义字面量operator ""
尖括号修复>> 正确解析
thread_local线程局部存储

10.2 标准库核心新增

库组件说明
std::unique_ptr独占所有权智能指针
std::shared_ptr / std::weak_ptr共享所有权和弱引用智能指针
std::function通用可调用对象包装器
std::bind参数绑定
std::tuple异构固定大小集合
std::array固定大小数组
std::forward_list单向链表
std::unordered_map / unordered_set哈希表容器
std::regex正则表达式库
std::chrono时间库
std::random随机数库
std::thread线程
std::mutex / std::lock_guard互斥锁
std::condition_variable条件变量
std::future / std::promise / std::async异步任务
std::atomic原子操作
std::type_traits编译期类型特征
std::initializer_list初始化列表支持
std::ratio编译期有理数
std::move / std::forward移动和完美转发工具
std::begin / std::end通用获取迭代器

十一、异常处理

11.1 核心机制

组件说明
throw抛出异常对象
try定义受监控代码块
catch按类型匹配捕获异常
栈展开从 throw 到 catch 之间销毁自动对象
std::exception标准异常基类

11.2 C++11 变更

  • noexcept 替代弃用的动态异常规范(throw() 等)
  • noexcept 运算符:编译期检测表达式是否可能抛出
  • std::nested_exception:支持嵌套异常

11.3 异常安全保证

级别说明
基本保证不泄露资源,对象处于有效状态
强保证操作要么完全成功,要么回滚到操作前状态
不抛出保证(noexcept)操作永远不会抛出异常

十二、预处理

指令功能
#include包含头文件
#define / #undef宏定义 / 取消
#if / #ifdef / #ifndef / #else / #elif / #endif条件编译
#error产生编译错误
#pragma实现特定指令
#line控制行号
# / ##字符串化 / 连接运算符

预定义宏:__cplusplus(C++11 为 201103L)、__LINE__、__FILE__、__DATE__、__TIME__ 等。


十三、标准库结构

13.1 标准库头文件分类

类别章节核心头文件
语言支持18<cstdint>, <limits>, <new>, <typeinfo>, <exception>, <initializer_list>
诊断19<stdexcept>, <system_error>, <cassert>
通用工具20<utility>, <tuple>, <memory>, <functional>, <type_traits>, <chrono>, <ratio>
字符串21<string>
本地化22<locale>
容器23<vector>, <deque>, <list>, <forward_list>, <map>, <set>, <unordered_map>, <unordered_set>, <array>, <queue>, <stack>
迭代器24<iterator>
算法25<algorithm>
数值26<complex>, <random>, <valarray>, <numeric>, <cmath>
I / O27<iostream>, <fstream>, <sstream>, <iomanip>
正则表达式28<regex>
原子操作29<atomic>
线程30<thread>, <mutex>, <condition_variable>, <future>

13.2 容器选择指南

需求场景推荐容器
随机访问 + 末尾增删std::vector
首尾快速增删std::deque
任意位置快速增删std::list 或 std::forward_list
键值查找(有序)std::map / std::set
键值查找(无序 / 高性能)std::unordered_map / std::unordered_set
固定大小std::array
FIFOstd::queue
LIFOstd::stack
优先级队列std::priority_queue

十四、并发编程(C++11)

14.1 内存序

内存序说明
memory_order_relaxed无同步保证,仅保证原子性
memory_order_consume消费操作,依赖数据同步
memory_order_acquire获取操作,后续读写不能重排到此操作前
memory_order_release释放操作,之前的读写不能重排到此操作后
memory_order_acq_rel获取 - 释放,兼具两者特性
memory_order_seq_cst顺序一致性,全局单一修改顺序(默认、最强)

14.2 同步原语

原语功能
std::mutex不可重入互斥锁
std::recursive_mutex可重入互斥锁
std::timed_mutex带超时的互斥锁
std::lock_guardRAII 自动加锁 / 解锁
std::unique_lock可延迟加锁、提前解锁、可转移的 RAII 锁
std::condition_variable等待 / 通知模式
std::once_flag + std::call_once保证函数只被调用一次
std::atomic_flag无锁布尔原子标志
std::atomic<T>通用原子类型模板

十五、最佳实践要点

  1. 优先使用智能指针而非裸指针:unique_ptr 优先于 shared_ptr(无循环引用需求时)
  2. 使用 RAII 管理所有资源:文件、锁、内存、套接字等
  3. 遵循 Rule of Five:如果自定义析构 / 拷贝 / 移动任一,通常应全部显式定义
  4. 优先使用 {} 初始化:统一初始化语法,防止窄化和最令人烦恼的解析
  5. 用 constexpr 替代宏常量:类型安全、作用域控制
  6. 用 nullptr 替代 NULL 或 0:类型安全的空指针
  7. 用 enum class 替代传统 enum:作用域安全、强类型
  8. 用 override 标注所有虚函数覆盖:编译期检查防止签名不匹配
  9. 用 noexcept 标注不抛出函数:帮助编译器优化,表达语义意图
  10. 用 auto 简化复杂类型声明:尤其在泛型编程中
  11. 避免数据竞争:多线程访问共享数据使用 atomic 或加锁
  12. 理解值类别:合理使用 std::move 和 std::forward,避免误用移动语义
  13. 优先算法而非手写循环:使用标准库算法提高可读性和性能

参考标准:ISO / IEC 14882:2011 — Programming Language C++(Working Draft n3337) (内容由AI生成,仅供参考)

下一页
C++ 专业术语