Leanpub Header

Skip to main content

现代C++编程实战

从入门到应用

驾驭现代C++,探索高性能编程的无限可能!

C++ 曾被誉为“性能之王”,它支撑着操作系统、游戏引擎、人工智能、高性能计算等关键领域。但随着 C++11、C++17、C++20 的演进,现代 C++ 已焕发新生,让编程更简洁、更安全、更高效!

本书跳过过时的 C++ 语法,专注于现代 C++ 的核心特性——智能指针、Lambda 表达式、模板编程、并发控制……无论你是编程新手,还是希望提升技能的开发者,都能在本书中找到清晰的讲解、直观的示例,以及贴近实际的项目案例。

深入浅出,理论结合实践,让 C++ 学习不再艰难!

? 直击现代 C++ 标准:聚焦 C++11-C++23,摒弃陈旧语法,专注实战应用。

? 从零开始,循序渐进:简洁示例+详细解析,助你快速掌握关键概念。

?️ 贴近实际的项目案例:涵盖游戏开发、数据结构、AI 计算,理论与实战并行。

? 适合各层次读者:无论你是初学者,还是有经验的开发者,都能受益匪浅。

? 翻开本书,开启你的现代 C++ 之旅!

Minimum price

$11.90

$29.00

You pay

$29.00

Author earns

$23.20
$

...Or Buy With Credits!

You can get credits with a paid monthly or annual Reader Membership, or you can buy them here.

Buying multiple copies for your team? See below for a discount!

PDF
About

About

About the Book

现代 C++ 编程实战:从入门到应用》 旨在帮助读者掌握 C++ 的最新特性,并通过实践案例提升编程能力。本书不同于传统 C++ 教材,直接基于 C++11 及更新的标准,避免过时语法,注重实用性。

适合人群

  • C++ 初学者,希望从现代 C++ 入门,不受过时语法困扰
  • 有编程经验的开发者,想高效掌握 C++11 及更新特性
  • 关注性能优化、系统编程、游戏开发的工程师

书籍特色

聚焦现代 C++:直接讲解 C++11 - C++23 特性,简化学习路径

简洁易懂:避免冗长理论,结合直观示例,快速上手

实战驱动:涵盖游戏开发、数据结构、AI 编程等真实案例

行业导向:关注 C++ 在高性能计算、嵌入式、金融等领域的应用

无论你是初学者,还是希望提升 C++ 技能的开发者,本书都将帮助你掌握现代 C++,并在实际项目中灵活运用。

Share this book

Categories

Team Discounts

Team Discounts

Get a team discount on this book!

  • Up to 4 members

    Minimum price
    $36.00
    Suggested price
    $72.00
  • Up to 5 members

    Minimum price
    $40.00
    Suggested price
    $116.00
  • Up to 10 members

    Minimum price
    $70.00
    Suggested price
    $203.00
  • Up to 15 members

    Minimum price
    $80.00
    Suggested price
    $290.00
  • Up to 25 members

    Minimum price
    $125.00
    Suggested price
    $435.00

Author

About the Author

hwdong

C9本科,高考数学物理1小时交卷、超出清华分数线20多分. Texas A&M、休斯顿大学访问学者. 曾从事计算机图形学、视觉等科研,目前主要从事计算机编程等网络课程的工作,写了3本书:C++17从入门到精通、Python3从入门到实战、解剖深度学习原理-从0实现深度学习库。在YouTube频道hwdong上发布免费计算机相关的教学课程。

Contents

Table of Contents

  • 前言
    • C++ 的力量与现代化的新生
      • 为什么要学习 C++?
      • 为什么选择现代 C++?
      • 本书的初衷与目标
      • 本书特色
  • 第1章: C++介绍
    • 1.1 程序与编程语言
      • 1.1.1 计算机是什么
      • 1.1.2 计算机编程
    • 1.2 C++ 程序结构
      • 1.2.1 最简单的 C++ 程序
      • 1.2.2 函数
      • 1.2.3 语句
      • 1.2.4 程序注释
      • 1.2.5 Hello World 程序
      • 1.2.6 标准输入输出库和cout
      • 1.2.7 名字空间
      • 1.2.8 字符串和字符
      • 1.2.9 运算符与操作数
      • 1.2.10 宏定义 #define
      • 1.2.11 变量:命名的内存块
      • 1.2.12 标准输入流对象 cin
      • 1.2.13 用户定义类型
    • 1.3 数和字符的表示
      • 1.3.1 数的表示
      • 1.3.2 字符的表示
    • 1.4 编译与执行 C++ 程序
    • 习题
      • 一、单项选择题
      • 二、填空题
      • 三、简答题
      • 四、程序阅读题
      • 五、编程题
    • 实验
      • 实验题目 1:图案输出实验
      • 实验题目 2:计算圆的面积
  • 第2章: 变量和类型
    • 2.1 变量
      • 2.1.1 变量的定义与初始化
      • 2.1.2 auto 类型推断
      • 2.1.3 typeid 运算符
      • 2.1.4 const
      • 2.1.5 decltype 类型推导
      • 2.1.6 decltype(auto)
      • 2.1.7 赋值运算符 =
      • 2.1.8 标识符、关键字和字面量
    • 2.2 数据类型
      • 2.2.1 基本类型的分类
      • 2.2.2 整数类型
      • 2.2.3 字符类型(Unicode 相关)
      • 2.2.4 浮点类型
      • 2.2.5 void类型
      • 2.2.6 bool 类型
      • 2.2.7 sizeof 运算符
    • 2.3 字面量
      • 2.3.1. 整型字面量
      • 2.3.2 浮点型字面量
      • 2.3.3 字符字面量和字符串字面量
      • 2.3.4 布尔字面量(Boolean Literals)
      • 2.3.5 空指针字面量(Null Pointer Literal)
      • 2.3.6 类型推导与字面量
      • 2.3.7 C++20及以后的新特性
    • 2.4 格式化输出
      • 2.4.1 流操纵符
    • 2.5 类型转换
      • 2.5.1. 隐式类型转换
      • 2.5.2 强制类型转换
      • 2.5.3 混合类型操作
    • 2.6 类型别名
      • 2.6.1 using
      • 2.6.2 类型别名的用途
      • 2.6.3 typedef和using的区别
    • 2.7 枚举类型
      • 2.7.1 enum class 与 enum 的区别
      • 2.7.2 定义枚举类型
      • 2.7.3 枚举值的底层类型
      • 2.7.4 枚举类型的比较和赋值
      • 2.7.5 旧式枚举(enum)
      • 2.7.6 总结
    • 2.8 局部变量与全局变量、变量的作用域与生命期
      • 2.8.1 程序块、局部变量和全局变量
      • 2.8.2 作用域和生命期
      • 全局作用域和 :: 作用域解析运算符
    • 习题
      • 选择题
      • 填空题
      • 判断题
      • 简答题
      • 程序阅读题
      • 编程题
    • 实验
      • 实验1. 变量的定义与基本数据类型
      • 实验2. auto 和 decltype 关键字
      • 实验3. 变量的作用域
  • 第3章: 运算符
    • 3.1 运算符与表达式
      • 3.1.1 运算符的分类
      • 3.1.2 表达式
      • 3.1.3. 优先级与结合性
    • 3.2 算术运算符
      • 3.2.1 二元算术运算符
      • 3.2.2 一元算术运算符
      • 3.2.3 算术运算符需要注意的几个问题
      • 3.2.4 自增 ++ 和自减 --
      • 3.2.4 数学计算函数库 <cmath>
      • 3.3 位运算
    • 3.4 赋值运算符
      • 3.5 关系运算符
      • 3.5.1 传统比较运算符
      • 3.5.2 太空船运算符 operator<=>
      • 3.5.3 浮点数比较的特殊情况:
    • 3.6 逻辑运算符
    • 3.7 特殊运算符
    • 3.8 新增、扩展与增强
      • 3.8.1 新增运算符
      • 3.8.2 现有运算符的扩展与增强
      • 总结
    • 习题
      • 一、选择题
      • 二、填空题
      • 三、判断题
      • 四、简单题
      • 五、编程题
    • 实验
      • 实验题目 1:运算符优先级与结合性实验
      • 实验题目 2:自增自减运算符实验
      • 实验题目 3::基本运算符的使用
  • 第4章: 语句
    • 4.1 简单语句、复合语句和控制语句
      • 4.1.1 简单语句
      • 4.1.2 复合语句
      • 4.1.3 控制语句
    • 4.2 条件语句
      • 4.2.1 if语句
      • 4.2.2 switch语句
      • 4.2.3 if/switch语句中的初始化(C++17)
    • 4.3 循环语句
      • 4.3.1 while语句
      • 4.3.2 break 语句
      • 4.3.3 do-while语句
      • 4.3.4 continue语句
      • 4.3.5 for语句
      • 4.3.6 范围 for 循环 (Range-based for loop)
    • 4.4 跳转语句
      • 4.4.1 break和continue
      • 4.4.2 return语句
      • 4.4.3 goto语句
      • 总结
    • 4.5 项目实战: 猜数字游戏
      • 4.5.1 游戏概述
      • 4.5.2 整个游戏的流程设计:
      • 4.5.3 详细设计
      • 4.5.4 最终代码:
    • 4.6 项目实战: 控制台Pong游戏
      • 4.6.1 Pong 游戏的起源与影响
      • 4.6.2 初始化游戏数据
      • 4.6.3 绘制游戏场景
      • 4.6.4 让球动起来
      • 4.6.5 事件处理: 用挡板击打球
      • 4.6.6 提高程序效率的方法:
    • 习题
      • 一、选择题(每题 2 分)
      • 二、填空题(每题 2 分)
      • 三、简答题(每题 5 分)
      • 四、代码分析题
      • 五、编程题(每题 10 分)
    • 实验
      • 实验 1:模拟银行 ATM(使用 switch-case)
      • 实验 2:计算器(switch-case 语句)
      • 实验 3:猜数字游戏(while 循环)
      • 实验 4:打印九九乘法表(for 循环)
      • 实验 5:输出素数(continue 和 break)
      • 实验 6:统计数组中的奇数和偶数(range-for 循环)
      • 实验 7:猜拳游戏(if-else 和 switch-case)
      • 实验 8:神秘密码(while 和 do-while)
      • 实验 9:21 点游戏(while + if)
      • 实验10:控制台 Pong 游戏
  • 第5章 复合类型:数组、指针和引用
    • 5.1 引用 (References)
      • 5.1.1 引用变量
      • 5.1.2 引用的重要特性
    • 5.2. 指针 (Pointers)
      • 5.2.1 指针类型 (Pointer Types)
      • 空指针 (Null Pointers)
      • 5.2.2 指针的其他运算
      • 5.2.3 void* (无类型指针)
      • 5.2.4 指针的指针
      • 5.2.5 指针的引用
      • 5.2.6 引用和指针的比较
    • 5.3 数组
      • 5.3.1. 数组的定义
      • 5.3.2 下标运算符 [] 访问数组元素
      • 5.3.3 数组相关限制与注意事项
      • 5.3.4 复杂的数组声明
      • 5.3.4 C风格字符串
      • 5.3.5 指针访问数组
      • 5.3.6 Range-based for 访问数组元素
      • 5.3.7 多维数组
    • 5.4 const 与指针、引用的结合
      • 5.4.1 const和指针
      • 5.4.2 const 对象的引用
      • 5.4.3 总结对比
    • 5.5 内存管理:栈与动态内存分配
      • 5.5.1 栈内存
      • 5.5.2 动态内存分配 (new 和 delete)
      • 5.5.4 使用指针访问动态分配的内存
      • 5.5.5 使用动态内存表示多维数组
    • 5.6 实战:查找、排序
      • 5.6.1 顺序查找和二分查找
      • 5.6.2 冒泡排序和选择排序
    • 5.7 实战项目:学生成绩管理系统
      • 5.7.1 需求分析
      • 5.7.2 设计方案
      • 5.7.3 代码实现:
      • 扩展思考
    • 习题
      • 一、判断题
      • 二、选择题
      • 三、填空题
      • 四、问答题
      • 五、编程题
    • 实验
      • 实验1:简易库存管理系统
      • 实验2:基于一维动态数组的学生成绩管理系统
  • 第 6 章:函数
    • 6.1 函数是命名的程序块
      • 6.1.1 最大公约数
      • 6.1.2 函数的定义与调用
      • 6.1.3 返回值与 void 函数
      • 6.1.4 标准库函数举例
    • 6.2 函数声明与定义
      • 6.2.1 函数声明
      • 6.2.2 函数定义
      • 6.2.3 函数签名(Function Signature)
      • 6.2.4 函数声明与定义的关系
      • 6.2.5 函数声明与定义分开的实际应用:一个简单的工程项目示例
    • 6.3 函数参数
      • 6.3.1 参数传递
      • 6.3.2 默认参数
      • 6.3.3 数组作为形参
      • 6.3.4 const 与形参
      • 6.3.5 可变数目的形参
    • 6.4 返回值
      • 6.4.1 返回值类型
      • 6.4.2 返回语句的语法
      • 6.4.3 返回值的类型转换
      • 6.4.4 返回引用
      • 6.4.5 返回指针
      • 6.4.6 返回 const 值、const对象的引用和指针、const指针
      • 6.4.7 返回值优化
      • 总结
    • 6.5 静态变量
      • 6.5.1 静态局部变量
      • 6.5.2 文件作用域的静态变量
    • 6.6 函数重载
      • 6.6.1 什么是函数重载?
      • 6.6.2 什么是参数列表不同?
      • 6.6.3 重载解析
      • 6.6.4 const对象的 引用或指针对重载的影响
      • 6.6.5 总结
    • 6.7 内联函数
      • 6.7.1 什么是内联函数?
      • 6.7.2 内联函数的工作原理
      • 6.7.3 为什么使用内联函数?
      • 6.7.4 内联函数的使用场景
      • 6.7.5 注意事项与限制
      • 6.7.6 内联函数与宏的比较
      • 6.7.7 总结
    • 6.8 constexpr 关键字
      • 6.8.1 constexpr 变量
      • 6.8.2 constexpr 函数
      • 6.8.3 扩展:C++20 consteval 和 constinit)
      • 6.8.4 constexpr、consteval、constinit 的优缺点与使用场景
    • 6.9 递归函数:调用自身的函数
      • 6.9.1 递归和递归函数
      • 6.9.2 阶乘的递归函数
      • 6.9.3 递归函数的基本结构
      • 6.9.4 斐波那契数列
      • 6.9.5 最大公约数
      • 6.9.6 汉诺塔问题
      • 6.9.7 快速排序算法
      • 6.9.8 迷宫问题
      • 6.9.9 小结
    • 6.10 函数指针
      • 6.10.1 计算器函数calculate
      • 6.10.2 函数指针的定义和初始化
      • 函数指针的初始化
      • 6.10.3 通过函数指针调用函数
      • 6.10.4 函数指针作为函数参数
      • 6.10.5 函数指针数组
      • 6.10.6 小结
    • 6.11 Lambda 表达式
      • 6.11.1 为什么需要 Lambda 表达式?
      • 6.11.2 Lambda 表达式的基本形式和语法
      • 6.11.3 Lambda 表达式的赋值
      • 6.11.4 Lambda 表达式的参数和返回值
      • 6.11.4 捕获外部变量
      • 6.11.5 可变 Lambda(mutable)
      • 6.11.6 初始化捕获(init capture)
      • 6.11.7 Lambda 表达式的应用场景
      • 6.11.8 小结
    • 6.12 实战:二维字符图形库 ChGL
      • 6.12.1 如何在字符终端上绘图?
      • 6.12.2 字符图形库 ChGL
      • 6.12.3 优化屏幕刷新(屏幕绘制)函数
      • 6.12.4 控制台显示彩色
    • 6.13 实战:基于ChGL的控制台游戏
      • 6.13.1 游戏程序的框架
      • 6.13.2 用ChGL和函数重写Pong游戏
    • 习题
      • 一、选择题
      • 二、填空题
      • 三、判断题
      • 四、简答题
      • 五、编程题
  • 第7章: 函数模板
    • 7.1 为什么需要函数模板?
    • 7.2 函数模板的定义与实例化
      • 7.2.1 函数模板的定义
      • 7.2.2 函数模板的实例化
    • 7.3 显式指定模板参数与自动推断模板参数
      • 7.3.1. 自动推断模板参数(类型推导)
      • 7.3.2. 显式指定模板参数
    • 7.4 非类型模板参数
    • 7.5 模板模板参数
    • 7.6 模板参数的默认值
    • 7.7 返回类型推断
    • 7.8 函数模板与重载
    • 7.9 模板专门化
      • 7.9.1 类型模板参数的专门化
      • 7.9.2 非类型模板参数的专门化
    • 7.10 可变模板参数
      • 7.10.1. 什么是可变模板参数?
      • 7.10.2 参数包展开(Parameter Pack Expansion)
      • 7.10.3 折叠表达式(Fold Expression)
      • 特点:
      • 7.10.3 递归模板处理
      • 7.10.3 参数包展开、折叠表达式和递归模板处理的比较
      • 7.10.5 编译期平方表生成器
    • 习题
  • 第8章: 类与对象
    • 8.1 过程式编程:智能家居系统
      • 8.1.1 智能家居系统
      • 8.1.2 智能家居系统:过程式分析与设计
    • 8.2 面向对象编程:智能家居系统案例
      • 8.2.1 智能家居系统:面向对象分析与设计
      • 8.2.2 过程式编程和面向对象编程的优缺点
    • 8.3 类与对象:面向对象编程的基础
      • 8.3.1 类的定义
      • 8.3.2 定义类的对象(变量)
      • 8.3.3 成员访问运算符 .
      • 8.3.4 间接访问运算符->
      • 8.3.5 stuct和class区别
      • 8.3.6 添加成员函数:让对象拥有行为
      • 8.3.7 this 指针
      • 8.3.8 类对象的大小
    • 8.4 构造函数
      • 8.4.1 什么是构造函数?
      • 8.4.2 初始化成员列表
      • 8.4.3 初始化成员列表 vs 类内成员初始化器
      • 8.4.4 拷贝构造函数
      • 8.4.5 赋值运算符:operator=
      • 8.4.6 深拷贝与浅拷贝
      • 8.4.7 delete
      • 8.4.8 隐式类型转换、explicit
      • 8.4.9 类对象数组
      • 8.4.10 委托构造函数
      • 8.4.11 类体外定义成员函数和构造函数
      • 8.4.12 头文件与源文件的分离
    • 8.5 访问控制和接口
      • C++中的访问控制
      • 示例:Date 类的封装设计
    • 8.6 友元
      • 8.6.1 友元函数 (Friend Function)
      • 8.6.2 友元类 (Friend Class)
      • 8.6.3 友元的注意事项
    • 8.7 const 对象、const 成员函数和 mutable 成员变量
      • 8.7.1 const 对象
      • 8.7.2 const 成员函数
      • 8.7.3 重载 const
      • 8.7.4 mutable 成员变量
    • 8.8 析构函数
    • 8.9 内联成员函数 (Inline Member Functions)
      • 1. 隐式内联:在类定义内部定义函数体
      • 2. 显式内联:使用 inline 关键字在类内声明
      • 内联函数的适用场景与限制
    • 8.10 静态成员 (Static Members)
      • 8.10.1 非静态和静态成员变量
      • 8.10.2 静态常量
      • 8.10.3 静态成员函数 (Static Member Functions)
      • 8.10.4 类自身类型的静态成员变量
    • 8.11 实战:线性表及应用
      • 8.11.1 线性表
      • 8.11.2 线性表的顺序实现: 顺序表
      • #### 测试程序:
      • 8.11.3 线性表的链式实现:链表
      • 8.11.4 实战:实现一个图书管理程序
    • 8.12 面向对象的控制台字符图形库ChGL
    • 8.13 实战:面向对象游戏:基于链表的贪吃蛇游戏
      • 8.13.1 面向对象游戏引擎
      • 8.13.2 贪吃蛇游戏
    • 8.14 总结
    • 习题
      • 一、选择题
      • 二、判断题
      • 三、问题题
      • 四、编程题
      • 五、思考题
  • 第9章: 运算符重载
    • 9.1 运算符重载的两种方式
    • 9.2 运算符作为成员函数和外部函数重载的主要区别
    • 9.3 赋值运算符=
    • 9.4 下标运算符[]
    • 9.5 输入输出运算符
    • 9.6 比较运算符和<=> 运算符
      • 9.6.1 作为成员函数的比较运算符
      • 9.6.2 作为外部函数的比较运算符
      • 9.6.3 重载其他比较运算符
      • 9.6.4 <=> 运算符
      • 9.6.5 C++20 中 <=> 和 == 的详细规则:
      • 9.9.6 <=> 运算符的三种返回类型
    • 9.7 函数调用运算符 ()
      • 函数对象
    • 9.8 类型转换运算符
      • 9.8.1 类型转换运算符 operator type()
      • 9.8.2 隐式类型转换可能引发的歧义
    • 9.9 自增和自减运算符
      • 9.9.1 前缀和后缀形式的自增和自减运算符
      • 9.9.2 前缀与后缀自增的区别
    • 9.10 可以重载的运算符
      • 9.10.1 支持重载的运算符
      • 9.10.2 注意事项
      • 9.10.3 运算符重载的设计原则
    • 9.11 实战:矩阵
      • 1. 矩阵类的初步实现
      • 2. 扩展:深拷贝与矩阵运算符重载
      • 3. 测试代码
      • 4. 总结
    • 习题
  • 第10章:继承与派生
    • 10.1 继承与派生概述
      • 10.1.1 继承的基本概念
    • 10.2 类之间的关系:is-a 与 has-a
      • 10.2.1 is-a 关系 —— 继承
      • 10.2.2 has-a 关系 —— 组合
    • 10.3 派生类的定义
    • 10.4 成员的隐藏(Hide)
    • 10.5 继承方式与访问控制
      • 10.5.1. 默认继承方式
      • 10.5.2 继承方式类型
      • 10.5.3 访问控制规则
      • 10.5.4 可见性与存在性
      • 10.5.5. 示例:继承方式对可见性的影响
      • 10.5.6 总结
    • 10.6 对象切割
      • 10.6.1 对象切割的定义
      • 10.6.2. 对象切割的示例
      • 10.6.3. 内存布局与对象切割
      • 10.6.4. 对象切割的场景
      • 10.6.5. 避免对象切割
      • 10.6.6 总结
    • 10.7 向上类型转换与向下类型转换
      • 10.7.1 向上类型转换(Upcasting)
      • 10.7.2. 向下类型转换(Downcasting)
      • 10.7.3 总结
    • 10.8 派生类的构造函数、析构函数与拷贝构造函数
      • 10.8.1 构造函数与析构函数
      • 10.8. 2. 在初始化成员列表中调用基类构造函数
      • 10.8.3 拷贝构造函数
      • 10.8.4 本节要点
    • 10.9 虚函数与多态
      • 10.9.1 虚函数概述
      • 10.9.2 虚函数的基本示例
      • 10.9.3 虚函数的工作原理
      • 10.9.4 虚析构函数:
      • 10.9.5 编译时多态 vs 运行时多态
      • 10.9.6 类型转换与 dynamic_cast
      • 10.9.7 虚函数的一些语法规则
      • 10.9.8 总结
    • 10.10 多继承和虚基类
      • 10.10.1 多继承
      • 10.10.2 虚继承与菱形继承
    • 10.11 纯虚函数与抽象类
      • 10.11.1 纯虚函数
      • 10.11.2 抽象类
      • 10.11.3 派生类的实现
      • 10.11.4 抽象类的作用
      • 10.11.5 抽象类和接口
      • 总结
    • 10.12 实战项目:公司员工管理系统
      • 1. 项目描述
      • 2. 需求分析
      • 3. 识别类和对象
      • 4. 定义类的属性和行为
      • 5. 确定类之间的关系
      • 6. 设计对象的交互
      • 7 代码实现
    • 10.13 实战:仿``雷电战机''游戏
      • 10.13.1 精灵
      • 10.13.2 游戏引擎GameEngine
      • 10.13.3 碰撞检测和精灵的销毁
      • 10.13.4 让敌机运动和发射子弹
    • 习题
    • 实验
      • 实验 1:银行账户管理系统(基本继承)
      • 实验 2:几何图形系统(对象切割与作用域解析)
      • 实验 3:员工工资计算系统(虚函数与多态)
      • 实验 4:智能设备管理系统(多层继承与组合)
      • 实验 5:交通工具系统(虚函数、抽象类与 RTTI)
      • 实验6:公司员工管理系统
  • 第11章: 类模板
    • 11.1 类模板
      • 11.1.1 什么是类模板?
      • 11.1.2 类模板的实例化
      • 11.1.3 类模板的默认参数
      • 11.1.4 非类型模板参数
      • 11.1.5 定义类模板的成员函数
    • 11.2 模板特化与偏特化
      • 11.2.1 全特化
      • 11.2.2 偏特化
    • 11.3. 类模板的友元
      • 11.3.1 普通友元函数 或 友元类
      • 11.3.2 友元函数模板
      • 代码分析:
      • 11.3.3 类模板作为友元
    • 11.4 类模板与继承
      • 11.4.1. 类模板的继承
      • 11.4.2 关于 this-> 的必要性
      • 11.4.3. 继承不同模板参数的基类
      • 11.4.4. 继承模板成员函数
      • 总结
    • 11.5 实现一个简单的 Vector 类模板
      • 1. Vector类模板
      • 2 实现 Vector
      • 3. 代码解析
      • 4. 扩容机制
      • 5. 异常处理
      • 6. 总结
    • 11.6 本章小结
    • 习题
    • 实验
      • 实验 1:实现通用的 Array<T> 类模板
      • 实验 2:设计 Pair<T1, T2> 类模板
  • 第12章: 错误处理与异常处理
    • 12.1 引言
    • 12.2 传统错误处理机制
      • 12.2.1 错误码返回方式
      • 12.2.2 全局状态与信号处理
    • 12.3 异常处理机制
      • 12.3.1 基本语法
      • 12.3.2 异常处理的优势
    • 12.4 异常处理的高级主题
      • 12.4.1 标准异常类
      • 5. 总结
      • 12.4.2 自定义异常类
      • 12.4.3 noexcept和what()
      • 12.4.4 嵌套异常与异常重抛
    • 12.5 异常安全与 RAII
      • 12.5.1 异常安全级别
      • 12.5.2 RAII(资源获取即初始化)
      • 12.7 多线程中的异常处理
      • 12.8 最佳实践与总结
      • 12.8.1 异常处理的最佳实践
      • 12.8.2 传统错误处理 vs. 异常处理
      • 12.8.3 何时使用异常,何时使用错误码?
    • 12.6 总结
    • 习题
      • 一、选择题
      • 二、 判断题
      • 三、编程题
      • 四、思考题
  • 第13章: 移动语义
    • 13.1 左值与右值、左值引用与右值引用
      • 13.1.1 左值与右值
      • 13.1.2 左值和右值的转化
      • 13.1.3 左值引用和右值引用
    • 13.2 移动语义
      • 13.2.1 复制的开销
      • 13.2.2. 移动语义:避免不必要的复制
    • 13.3 本章小结
    • 习题
      • 一、选择题
      • 二、判断题
      • 三、编程题
      • 四、思考题
  • 第14章: 内存管理
    • 14.1. 手动内存管理的风险
      • 14.1.1 内存泄漏
      • 14.1.2 悬挂指针(Dangling Pointer)
      • 14.1.3 重复释放(Double Free)
      • 14.1.4 如何避免这些风险
    • 14.2 RAII(资源获取即初始化)思想
      • 14.2.1 RAII 的基本原则
      • 14.2.2 自定义 RAII 类管理动态内存
    • 14.3 智能指针
      • 14.3.1 std::unique_ptr
      • 14.3.2 std::shared_ptr
      • 14.3.3 std::weak_ptr
      • 14.3.4. 移动语义与智能指针的结合
    • 14.4 自定义删除器(Deleter)
      • 1 如何使用自定义删除器
      • 2 示例:自定义删除器
      • 3 std::unique_ptr 用于文件管理
      • 结论
    • 14.5. 低级内存管理
      • 14.5.1 使用 malloc 和 free 进行内存管理
      • 14.5.2 在已分配的内存上构造对象(Placement new)
      • 14.5.3 使用原始内存操作(如 定位 new)的意义
    • 14.6 自定义内存分配器与重载 operator new 和 operator delete
      • 14.6.1 重载 operator new 和 operator delete 的意义
      • 14.6.2 重载 operator new 和 operator delete 的基本方式
      • 14.6.3. 重载 operator new 和 operator delete 的实际意义
      • 14.6.4. 总结
    • 14.7 本章总结
    • 习题
      • 一、选择题
      • 二、判断题
      • 三、编程题
      • 四、思考题
  • 第15章: C++标准库介绍
    • 15.1 输入输出流库
      • 15.1.1 C++的IO流库
      • 15.1.2 格式化输入输出
      • 15.1.3 非格式化输入输出
      • 15.1.4 文件位置
      • 15.1.5 流状态
      • 15.1.6 管理输出缓冲区
      • 15.1.7 文件输入输出
      • 15.1.8 字符串流(String Streams)
    • 15.2 容器
      • 15.2.1 标准容器
      • 15.2.2 序列容器(Sequence containers)
      • 15.2.3 容器适配器(Container Adapters)
      • 15.2.4 关联容器 (Associative Containers)
    • 15.3 迭代器
      • 15.3.1 迭代器及其分类
      • 15.3.2 迭代器适配器
      • 15.3.3 数组、字符串和迭代器
    • 15.4 算法
      • 15.4.1 自定义通用算法
      • 15.4.2 策略参数
      • 15.4.3 标准库的常用算法
      • 注:
    • 15.5 字符串
      • 15.5.1 字符:、
      • 15.5.2 C 风格字符串
      • 15.5.3 C++ 的字符串:std::string
      • 15.5.4 Unicode 字符串类型
      • 总结
    • 15.6 多线程与并发(Threading and Concurrency)
      • 15.6.1 创建和管理线程
      • 15.6.2 线程的同步
      • 15.6.3 使用锁和std::lock_guard
      • 15.6.4 条件变量
      • 15.6.5 多线程的最佳实践
      • 15.6.6 总结
    • 15.7 正则表达式(Regular Expressions)
      • 15.7.1. 什么是正则表达式?
      • 15.7.2. C++ 正则表达式基础
      • 15.7.3. 进阶匹配:查找和提取
      • 15.7.4. 替换文本:std::regex_replace
      • 15.7.5. 正则表达式常见模式
      • 15.7.6. 总结
    • 15.8 内存管理(Memory Management)
      • 15.8.1 引言:现代 C++ 的内存管理理念
      • 15.8.2 RAII(资源获取即初始化)
      • 15.8.3 智能指针:自动管理动态内存
      • 15.8.4 低级内存管理工具
      • 15.8.5 并发环境下的内存管理
      • 15.8.6 总结
    • 习题
      • 一、选择题
      • 二、判断题
      • 三、编程题
      • 四、思考题
  • 第16章: 元编程
    • 16.1 模板元编程(TMP)
      • 16.1.1 什么是模板元编程
      • 16.1.2 模板特化
      • 16.1.3 递归模板与计算
      • 16.1.4 类型计算
      • 16.1.5 编译时类型检查
    • 16.2 类型traits(Type Traits)
      • 16.2.1 std::is_integral
    • 16.3 SFINAE
    • 16.4. constexpr
      • 16.4.1 constexpr变量
      • 16.4.2 constexpr函数
      • 16.4.3 if constexpr
      • 16.4.4 constexpr 循环
      • 16.4.5 constexpr 对象
    • 16.5 应用实例
      • 16.5.1 静态断言与编译期检查
      • 16.5.2 变长模板参数处理
      • 16.5.3 静态多态 (Static Polymorphism) - CRTP (Curiously Recurring Template Pattern)
      • 16.5.4 编译时字符串生成
    • 16.6 元编程的优缺点
      • 最佳实践指南
    • 16.7总结
    • 习题
  • 参考文献

The Leanpub 60 Day 100% Happiness Guarantee

Within 60 days of purchase you can get a 100% refund on any Leanpub purchase, in two clicks.

Now, this is technically risky for us, since you'll have the book or course files either way. But we're so confident in our products and services, and in our authors and readers, that we're happy to offer a full money back guarantee for everything we sell.

You can only find out how good something is by trying it, and because of our 100% money back guarantee there's literally no risk to do so!

So, there's no reason not to click the Add to Cart button, is there?

See full terms...

Earn $8 on a $10 Purchase, and $16 on a $20 Purchase

We pay 80% royalties on purchases of $7.99 or more, and 80% royalties minus a 50 cent flat fee on purchases between $0.99 and $7.98. You earn $8 on a $10 sale, and $16 on a $20 sale. So, if we sell 5000 non-refunded copies of your book for $20, you'll earn $80,000.

(Yes, some authors have already earned much more than that on Leanpub.)

In fact, authors have earned over $14 million writing, publishing and selling on Leanpub.

Learn more about writing on Leanpub

Free Updates. DRM Free.

If you buy a Leanpub book, you get free updates for as long as the author updates the book! Many authors use Leanpub to publish their books in-progress, while they are writing them. All readers get free updates, regardless of when they bought the book or how much they paid (including free).

Most Leanpub books are available in PDF (for computers) and EPUB (for phones, tablets and Kindle). The formats that a book includes are shown at the top right corner of this page.

Finally, Leanpub books don't have any DRM copy-protection nonsense, so you can easily read them on any supported device.

Learn more about Leanpub's ebook formats and where to read them

Write and Publish on Leanpub

You can use Leanpub to easily write, publish and sell in-progress and completed ebooks and online courses!

Leanpub is a powerful platform for serious authors, combining a simple, elegant writing and publishing workflow with a store focused on selling in-progress ebooks.

Leanpub is a magical typewriter for authors: just write in plain text, and to publish your ebook, just click a button. (Or, if you are producing your ebook your own way, you can even upload your own PDF and/or EPUB files and then publish with one click!) It really is that easy.

Learn more about writing on Leanpub