Post

《Learn C++》笔记 C++目录

《Learn C++》笔记 C++目录

LearnCpp.com 是一个免费网站,致力于教你如何用现代 C++ 编程。本网站的课程将引导你完成编写、编译和调试 C++ 程序所需的所有步骤。无需任何编程经验,但各个级别的程序员都能从我们的最佳实践、技巧和见解中获益。

成为专家并非一朝一夕之功,但只要有点耐心,你终会达成目标。LearnCpp.com 将为你指明方向。

这是我学习Alex的LearnC++课程的笔记(跳转原文点击LearnCpp.com)。
因为我英文不太好, 又喜欢C++, 在偶然领略到Alex的LearnC++的精妙之后, 我决定克服英文困难,投入精力去享受这部匠心之作, 一边翻译, 一边学习C++。
我确信这些笔记并不完善, 即使改用了DeepL, 也面临着词不达意的翻译难题;似乎每次阅读都会发现一些新的拼写错误,所以请不要抱太高的期望。

推荐赵正阳的《C++程序设计原理与实践》笔记

简介/入门指南

第一章 C++基础

  • 1.1 程序的语句和结构
  • 1.2 注解
  • 1.3 对象和变量介绍
  • 1.4 变量赋值与初始化
  • 1.5 iostream 介绍:cout、cin 和 endl
  • 1.6 未初始化的变量和未定义行为
  • 1.7 关键词和命名标识符
  • 1.8 空白和基本格式
  • 1.9 字面量和运算符介绍
  • 1.10 表达式介绍
  • 1.11 开发你的第一个程序
  • 1.x 第一章概要及测验

第二章 C++基础:函数和文件

  • 2.1 函数介绍
  • 2.2 函数返回值(返回值的函数)
  • 2.3 Void函数(不返回值的函数)
  • 2.4 函数形参和实参介绍
  • 2.5 局部作用域介绍
  • 2.6 函数为何有用,以及如何有效使用它们
  • 2.7 前向声明与定义
  • 2.8 包含多个代码文件的程序
  • 2.9 命名冲突及命名空间介绍
  • 2.10 预处理器介绍
  • 2.11 头文件
  • 2.12 头文件保护机制
  • 2.13 如何设计你的第一个程序
  • 2.x 第二章总结和测验

第三章 C++程序调试

  • 3.1 语法和语义错误
  • 3.2 调试过程
  • 3.3 调试策略
  • 3.4 基础调试策略
  • 3.5 更多调试策略
  • 3.6 使用集成调试器:单步执行
  • 3.7 使用集成调试器:运行和断点
  • 3.8 使用集成调试器:监视变量
  • 3.9 使用集成调试器:调用栈
  • 3.10 在问题出现之前发现它们
  • 3.x 第三章总结和测验

第四章 基本数据类型

  • 4.1 基本数据类型介绍
  • 4.2 Void
  • 4.3 对象大小和 sizeof 运算符
  • 4.4 有符号整数
  • 4.5 无符号整数以及其应避免使用的原因
  • 4.6 固定宽度整数和 size_t
  • 4.7 科学计数法介绍
  • 4.8 浮点数
  • 4.9 布尔值
  • 4.10 if语句介绍
  • 4.11 字符
  • 4.12 类型转换和 static_cast 介绍
  • 4.x 第四章总结和测验

第五章 常量和字符串

  • 5.1 常量变量(命名常量)
  • 5.2 字面量
  • 5.3 数制(十进制、二进制、十六进制和八进制)
  • 5.4 假设规则与编译时优化
  • 5.5 常量表达式
  • 5.6 constexpr 变量
  • 5.7 std::string 介绍
  • 5.8 std::string_view 介绍
  • 5.9 std::string_view(第二部分)
  • 5.x 第五章总结和测验

第六章 操作符

  • 6.1 运算符优先级和结合性
  • 6.2 算术运算符
  • 6.3 余数和幂运算
  • 6.4 递增/递减运算符及其副作用
  • 6.5 逗号运算符
  • 6.6 条件运算符
  • 6.7 关系运算符和浮点数比较
  • 6.8 逻辑运算符
  • 6.x 第六章总结和测验

第O章 位操作(可选章节)

  • O.1 通过 std::bitset 进行位标志和位操作
  • O.2 位运算符
  • O.3 使用位运算符和位掩码进行位操作
  • O.4 二进制和十进制之间的整数转换

第七章 范围、持续时间和关联性

  • 7.1 复合语句(代码块)
  • 7.2 用户定义的命名空间和作用域解析运算符
  • 7.3 局部变量
  • 7.4 全局变量介绍
  • 7.5 变量遮蔽(名称隐藏)
  • 7.6 内部链接
  • 7.7 外部链接和变量前向声明
  • 7.8 为何(非常量)全局变量是邪恶的
  • 7.9 内联函数和变量
  • 7.10 在多个文件中共享全局常量(使用内联变量)
  • 7.11 静态局部变量
  • 7.12 作用域、存储期和链接总结
  • 7.13 using声明和using指令
  • 7.14 未命名和内联命名空间
  • 7.x 第七章总结和测验

第八章 控制流

  • 8.1 控制流介绍
  • 8.2 if语句和代码块
  • 8.3 常见的if语句问题
  • 8.4 constexpr if语句
  • 8.5 switch语句基础
  • 8.6 switch语句的贯穿和作用域
  • 8.7 goto 语句
  • 8.8 循环和 while 语句介绍
  • 8.9 do while 语句
  • 8.10 for 语句
  • 8.11 break和continue
  • 8.12 halt(提前退出程序)
  • 8.13 随机数生成介绍
  • 8.14 使用梅森旋转算法生成随机数
  • 8.15 全局随机数(Random.h)
  • 8.x 第八章总结和测验

第九章 错误检测与处理

  • 9.1 代码测试介绍
  • 9.2 代码覆盖率
  • 9.3 C++中常见的语义错误
  • 9.4 检测和处理错误
  • 9.5 std::cin 和处理无效输入
  • 9.6 断言和静态断言
  • 9.x 第九章总结及测验

第十章 类型转换、类型别名和类型推导

  • 10.1 隐式类型转换
  • 10.2 浮点数和整数提升
  • 10.3 数值转换
  • 10.4 窄化转换、列表初始化和 constexpr 初始化器
  • 10.5 算术转换
  • 10.6 显式类型转换(强制转换)和 static_cast
  • 10.7 类型定义和类型别名
  • 10.8 对使用 auto 关键字对对象进行类型推导
  • 10.9 函数类型推导
  • 10.x 第十章总结和测验

第十一章 函数重载和函数模板

  • 11.1 函数重载介绍
  • 11.2 函数重载的区分
  • 11.3 函数重载解析和歧义匹配
  • 11.4 删除函数
  • 11.5 默认实参
  • 11.6 函数模板
  • 11.7 函数模板实例化
  • 11.8 具有多个模板类型的函数模板
  • 11.9 非类型模板形参
  • 11.10 在多个文件中使用函数模板
  • 11.x 第十一章总结和测验

第F章 Constexpr 函数

  • F.1 constexpr 函数
  • F.2 constextpr 函数(第 2 部分)
  • F.3 constexpr 函数(第 3 部分)和 consteval
  • F.4 constextpr 函数(第 4 部分)
  • F.x F 章总结和测验

第十二章 复合类型:引用和指针

  • 12.1 复合数据类型介绍
  • 12.2 值类别(左值和右值)
  • 12.3 左值引用
  • 12.4 常量左值引用
  • 12.5 按左值引用传递
  • 12.6 按常量左值引用传递
  • 12.7 指针介绍
  • 12.8 空指针
  • 12.9 指针和常量
  • 12.10 按地址传递
  • 12.11 按地址传递(第二部分)
  • 12.12 按引用返回和按地址返回
  • 12.13 输入和输出形参
  • 12.14 使用指针、引用和 const 进行类型推导
  • 12.15 std::optional
  • 12.x 第十二章总结和测验

第十三章 复合类型:枚举和结构

  • 13.1 程序定义(用户定义)类型介绍
  • 13.2 无作用域枚举
  • 13.3 无作用域枚举器整型转换
  • 13.4 枚举与字符串之间的转换
  • 13.5 I/O 运算符重载介绍
  • 13.6 作用域枚举(枚举类)
  • 13.7 结构体、成员和成员选择简介
  • 13.8 结构聚合初始化
  • 13.9 默认成员初始化
  • 13.10 传递和返回结构体
  • 13.11 结构杂项
  • 13.12 使用指针和引用进行成员选择
  • 13.13 类模板
  • 13.14 类模板参数推导(CTAD)和推导指南
  • 13.15 别名模板
  • 13.x 第十三章总结和测验
  • 13.y 使用语言参考

第十四章 class介绍

  • 14.1 面向对象编程介绍
  • 14.2 类简介
  • 14.3 成员函数
  • 14.4 const类对象和const成员函数
  • 14.5 共有和私有成员以及访问限定符
  • 14.6 访问函数
  • 14.7 返回对数据成员的引用的成员函数
  • 14.8 数据隐藏(封装)的优势
  • 14.9 构造函数介绍
  • 14.10 构造函数成员初始化列表
  • 14.11 默认构造函数和默认参数
  • 14.12 委托构造函数
  • 14.13 临时类对象
  • 14.14 复制构造函数介绍
  • 14.15 类初始化和复制省略
  • 14.16 转换构造函数和显式关键字
  • 14.17 Constexpr 聚合和类
  • 14.x 第十四章总结和测验

第十五章 更多class信息

  • 15.1 隐藏的“this”指针和成员函数链式调用
  • 15.2 类和头文件
  • 15.3 嵌套类型(成员类型)
  • 15.4 析构函数介绍
  • 15.5 带有成员函数的类模板
  • 15.6 静态成员变量
  • 15.7 静态成员函数
  • 15.8 友元非成员函数
  • 15.9 好友类和友元成员函数
  • 15.10 引用限定符
  • 15.x 第十五章总结和测验

第十六章 动态数组:std::vector

  • 16.1 容器和数组介绍
  • 16.2 std::vector 和 list 构造函数介绍
  • 16.3 std::vector 和无符号长度及下标问题
  • 16.4 传递 std::vector
  • 16.5 返回 std::vector及移动语义介绍
  • 16.6 数组和循环
  • 16.7 数组、循环和符号挑战解决方案
  • 16.8 基于范围的 for 循环(for-each)
  • 16.9 使用枚举器进行数组索引和长度操作
  • 16.10 std::vector 动态调整大小和容量
  • 16.11 std::vector 和堆栈的行为
  • 16.12 std::vector
  • 16.x 第十六章总结和测验

第十七章 固定大小数组:std::array 和 C 风格数组

  • 17.1 std::array 介绍
  • 17.2 std::array 的长度和索引
  • 17.3 传递和返回 std::array
  • 17.4 std::array 类型及花括号省略
  • 17.5 通过 std::reference_wrapper 实现引用数组
  • 17.6 std::array 和枚举
  • 17.7 C 风格数组介绍
  • 17.8 C 风格数组衰减
  • 17.9 指针运算和下标
  • 17.10 C 风格字符串
  • 17.11 C 风格字符串符号常量
  • 17.12 多维 C 风格数组
  • 17.13 多维 std::array
  • 17.x 第十七章总结和测验

第十八章 迭代器和算法

  • 18.1 使用选择排序对数组进行排序
  • 18.2 迭代器介绍
  • 18.3 标准库算法介绍
  • 18.4 代码计时

第十九章 动态分配

  • 19.1 使用 new 和 delete 进行动态内存分配
  • 19.2 动态分配数组
  • 19.3 析构函数
  • 19.4 指针的指针和动态多维数组
  • 19.5 空指针

第二十章 函数

  • 20.1 函数指针
  • 20.2 栈和堆
  • 20.3 递归
  • 20.4 命令行参数
  • 20.5 省略号(以及为什么要避免使用省略号)
  • 20.6 引入lambda 表达式(匿名函数)
  • 20.7 Lambda 捕获
  • 20.x 第20章总结和测验

第二十一章 运算符重载

  • 21.1 运算符重载介绍
  • 21.2 使用友元函数重载算术运算符
  • 21.3 使用普通函数重载运算符
  • 21.4 重载I/O操作符
  • 21.5 使用成员函数重载运算符
  • 21.6 重载一元运算符 +、- 和 !
  • 21.7 重载比较运算符
  • 21.8 重载递增和递减运算符
  • 21.9 重载下标运算符
  • 21.10 重载括号运算符
  • 21.11 重载类型转换
  • 21.12 重载赋值运算符
  • 21.13 浅拷贝与深拷贝
  • 21.14 运算符重载和函数模板
  • 21.x 第二十一章概要与测验
  • 21.y 第二十一章项目

第二十二章 移动语义和智能指针

  • 22.1 智能指针和移动语义介绍
  • 22.2 R 值引用
  • 22.3 移动构造函数和移动赋值
  • 22.4 std::move
  • 22.5 std::unique_ptr
  • 22.6 std::shared_ptr
  • 22.7 std::shared_ptr 和 std::weak_ptr 的循环依赖问题
  • 22.x 第二十二章总结和测验

第二十三章 对象关系

  • 23.1 对象关系
  • 23.2 组合
  • 23.3 聚合
  • 23.4 关联
  • 23.5 依赖
  • 23.6 容器类
  • 23.7 std::initializer_list
  • 23.x 第二十三章总结和测验

第二十四章 继承

  • 24.1 继承介绍
  • 24.2 C++中的基本继承
  • 24.3 派生类的构造顺序
  • 24.4 派生类的构造函数与初始化
  • 24.5 继承和访问限定符
  • 24.6 为派生类添加新功能
  • 24.7 调用继承函数与覆盖行为
  • 24.8 隐藏继承的功能
  • 24.9 多重继承
  • 24.x 第24章总结和测验

第二十五章 虚函数

  • 25.1 指向派生对象基类的指针和引用
  • 25.2 虚函数和多态性
  • 25.3 覆盖和最终说明符,以及协变返回类型
  • 25.4 虚析构函数、虚赋值和覆盖虚化
  • 25.5 早期绑定和晚期绑定
  • 25.6 虚表
  • 25.7 纯虚函数、抽象基类和接口类
  • 25.8 虚基类
  • 25.9 对象切片
  • 25.10 动态转化
  • 25.11 使用operator«打印继承类
  • 25.x 第二十五章总结和测验

第二十六章 模板和类

  • 26.1 模板类
  • 26.2 模板非类型参数
  • 26.3 函数模板特化
  • 26.4 类模板特化
  • 26.5 部分模板特化
  • 26.6 指针的部分模板特化
  • 26.x 第26章总结和测验

第二十七章 异常情况

  • 27.1 异常情况的必要性
  • 27.2 基本异常处理
  • 27.3 异常、函数和堆栈展开
  • 27.4 未捕获的异常和捕获所有异常的处理程序
  • 27.5 异常、类和继承
  • 27.6 重新抛出异常
  • 27.7 函数 try 块
  • 27.8 异常情况的风险和弊端
  • 27.9 异常规范和 noexcept
  • 27.10 std::move_if_noexcept
  • 27.x 第27章总结和测验

第二十八章 输入和输出(I/O)

  • 28.1 输入和输出 (I/O) 流
  • 28.2 使用 istream 输入
  • 28.3 使用 ostream 和 ios 输出
  • 28.4 字符串流类
  • 28.5 流状态和输入验证
  • 28.6 基本文件 I/O
  • 28.7 随机文件 I/O

附录A 杂项主题

  • A.1 静态库和动态库
  • A.2 在 Visual Studio 中使用库
  • A.3 在 Code::Blocks 中使用库
  • A.4 C++常见问题解答

附录B C++ 更新

  • B.1 C++11 简介
  • B.2 C++14 简介
  • B.3 C++17 简介
  • B.4 C++20 简介
  • B.5 C++23 简介

附录C 剧终

  • C.1 结束了吗?

附录D 已弃用文章

  • 21.1 标准库
  • 21.2 STL容器概述
  • 21.3 STL迭代器概述
  • 21.4 STL算法概述
  • 22.1 std::string 和 std::wstring
  • 22.2 std::string 的构造和销毁
  • 22.3 std::string 的长度和容量
  • 22.4 std::string 字符访问和转换为 C 风格数组
  • 22.5 std::string 赋值和交换
  • 22.6 std::string 追加
  • 22.7 std::string 插入
This post is licensed under CC BY 4.0 by the author.