Skip to content

Commit e005c2e

Browse files
committed
add book files
1 parent 71025d8 commit e005c2e

12 files changed

+2473
-10
lines changed

README.md

+6-10
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,25 @@
1-
《高速上手 C++11/14/17》
2-
====
1+
#《高速上手 C++11/14/17》
32

4-
> 本教程正在向支持 C++17 的内容过度,尽请期待。
3+
> 本教程正在向全面介绍 C++17 特性的内容过度,尽请期待。
54
65
![](assets/cover-2nd.png)
76

8-
本书目的
9-
--
7+
## 本书目的
108

119
本教程号称高速上手教程,从内容上对 C++11/14/17 (与惯例不同,本书决定统一称为 C++1x)的相关特性做了一个相对全面的介绍,读者可以自行根据下面的目录选取感兴趣的内容进行学习,快速熟悉需要了解的内容,这从某种意义上来说,也算是高速上手了。
1210

1311
这些特性并不需要全部掌握,只需针对特定的应用场景,学习、查阅最适合自己的新特性即可。
1412

1513
值得一提的是,本教程在介绍这些特性的过程中,尽可能简单明了的介绍了这些特性产生的历史背景和技术需求,这为理解这些特性、运用这些特性提供了很大的帮助。
1614

17-
目标读者
18-
--
15+
## 目标读者
1916

2017
1. 本教程假定读者已经熟悉了传统 C++ ,至少在阅读传统 C++ 代码上不具备任何困难。换句话说,那些长期使用传统 C++进行编码的人、渴望在短时间内迅速了解 **Modern C++** 特性的人非常适合阅读本书;
2118
2. 本教程一定程度上介绍了一些 C++1x 的**黑魔法**,但这些魔法毕竟有限,不适合希望进阶学习 C++1x 的读者,本教程的定位系**C++1x 的快速上手**。当然,希望进阶学习的读者可以使用本书来回顾并检验自己对 **Modern C++** 的熟悉度。
2219

23-
目录
24-
--
20+
## 目录
2521

26-
> 正在向支持 C++17 的内容过度
22+
> 正在向全面介绍 C++17 特性的内容过度
2723
2824
- **第一章 C++11/14 简介**
2925
+ 概述

assets/cover-2nd.png

584 Bytes
Loading

book/0-preface.md

+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# 高速上手 C++ 11/14
2+
3+
## 引言
4+
5+
C++ 算是一个用户群体比较大的语言了,从 C++98 到 C++11 经历了长达十年多之久的积累,C++14 则是作为对 C++11 的重要补充和优化,所有这些新标准中扩充的特性,给 C++ 这门语言注入了新的活力。
6+
那些还在坚持使用**传统 C++** (本教程把 C++98 及其之前的 C++ 特性均称之为传统 C++)而未接触过 C++11/14 的 C++ 程序员在见到诸如 Lambda 表达式这类全新特性时,甚至会流露出『学的不是同一门语言』的惊叹之情。
7+
8+
**C++1x** (本教程中指 C++11/14, 甚至 C++17) 为传统 C++ 注入的大量特性使得整个 C++ 变得更加像一门现代化的语言。C++1x 不仅仅增强了 C++ 语言自身的可用性,`auto` 关键字语义的修改使得我们更加有信心来操控极度复杂的模板类型。同时还对语言运行期进行了大量的强化,Lambda 表达式的出现让 C++ 具有了『匿名函数』的『闭包』特性,而这一特性几乎在现代的编程语言(诸如 Python/Swift/... )中已经司空见惯,右值引用的出现解决了 C++ 长期以来被人诟病的临时对象效率问题等等。
9+
10+
C++1x 为自身的标准库增加了非常多的工具和方法,诸如在语言层面上提供了 `std::thread` 支持了并发编程,在不同平台上不再依赖于系统底层的 API,实现了语言层面的跨平台支持;`std::regex`提供了完整的正则表达式支持等等。C++98 已经被实践证明了是一种非常成功的『范型』,而 C++1x 的出现,则进一步推动这种范型,让 C++ 成为系统程序设计和库开发更好的语言。
11+
12+
## 目标读者
13+
14+
1. 本教程假定读者已经熟悉了传统 C++ ,至少在阅读传统 C++ 代码上不具备任何困难。换句话说,那些长期使用传统 C++进行编码的人、渴望在短时间内迅速了解 **Modern C++** 特性的人非常适合阅读本书;
15+
2. 本教程一定程度上介绍了一些 C++1x 的**黑魔法**,但这些魔法毕竟有限,不适合希望进阶学习 C++1x 的读者,本教程的定位系**C++1x 的快速上手**。当然,希望进阶学习的读者可以使用本书来回顾并检验自己对 **Modern C++** 的熟悉度。
16+
17+
## 本书目的
18+
19+
本教程号称高速上手教程,从内容上对 C++11/14/17 (与惯例不同,本书决定统一称为 C++1x)的相关特性做了一个相对全面的介绍,读者可以自行根据下面的目录选取感兴趣的内容进行学习,快速熟悉需要了解的内容,这从某种意义上来说,也算是高速上手了。
20+
21+
这些特性并不需要全部掌握,只需针对特定的应用场景,学习、查阅最适合自己的新特性即可。
22+
23+
值得一提的是,**本教程在介绍这些特性的过程中,尽可能简单明了的介绍了这些特性产生的历史背景和技术需求,这为理解这些特性、运用这些特性提供了很大的帮助。**
24+
25+
目录
26+
--
27+
28+
> 正在向支持 C++17 的内容过度
29+
30+
- **第一章 C++11/14 简介**
31+
+ 概述
32+
+ 被弃用的特性
33+
+ 与 C 的兼容性
34+
- **第二章 语言可用性的强化**
35+
+ `nullptr``constexpr`
36+
+ 类型推导
37+
+ `auto`
38+
+ `decltype`
39+
+ 尾返回类型、`auto``decltype` 配合
40+
41+
<!--+ decltype(auto) (C++14)-->
42+
43+
+ 区间迭代
44+
+ 基于范围的 for 循环
45+
+ 初始化列表
46+
+ `std::initializer_list`
47+
+ 统一初始化语法
48+
+ 模板增强
49+
+ 外部模板
50+
+ 尖括号 `>`
51+
+ 类型别名模板
52+
+ 变长参数模板
53+
+ 面向对象增强
54+
+ 委托构造
55+
+ 继承构造
56+
+ 显式虚函数重载
57+
+ `override`
58+
+ `final`
59+
+ 显式禁用默认函数
60+
+ 强类型枚举
61+
- **第三章 语言运行期的强化**
62+
+ lambda 表达式
63+
+ lambda 表达式基础
64+
+ 值捕获
65+
+ 引用捕获
66+
+ 隐式捕获
67+
+ 表达式捕获
68+
+ 泛型 lambda
69+
+ 函数对象包装器
70+
+ std::function
71+
+ std::bind/std::placeholder
72+
+ 右值引用
73+
+ 左值、右值的纯右值、将亡值、右值
74+
+ 右值引用和左值引用
75+
+ 移动语义
76+
+ 完美转发
77+
- **第四章 对标准库的扩充: 新增容器**
78+
+ `std::array`
79+
+ `std::forward_list`
80+
+ `std::unordered_set`
81+
+ `std::unordered_map`
82+
+ `std::tuple`
83+
+ 基本操作
84+
+ 运行期索引
85+
+ 合并与迭代
86+
- **第五章 对标准库的扩充: 智能指针和引用计数**
87+
+ RAII 与引用计数
88+
+ `std::shared_ptr`
89+
+ `std::unique_ptr`
90+
+ `std::weak_ptr`
91+
- **第六章 对标准库的扩充: 正则表达式库**
92+
+ 正则表达式简介
93+
+ 普通字符
94+
+ 特殊字符
95+
+ 限定符
96+
+ `std::regex` 及其相关
97+
+ `std::regex`
98+
+ `std::regex_match`
99+
+ `std::match_results`
100+
- **第七章 对标准库的扩充: 语言级线程支持**
101+
+ `std::thread`
102+
+ `std::mutex`
103+
+ `std::unique_lock`
104+
+ `std::future`
105+
+ `std::packaged_task`
106+
+ `std::condition_variable`
107+
- **第八章 其他杂项**
108+
+ 新类型
109+
+ `long long int`
110+
+ `noexcept` 的修饰和操作
111+
+ 字面量
112+
+ 原始字符串字面量
113+
+ 自定义字面量
114+
- **第九章 扩展主题: C++17 简介**
115+
+ 主要入选特性
116+
+ 非类型模板参数的 `auto`
117+
+ `std::variant<>`
118+
+ 结构化绑定(Structured bindings)
119+
+ 变量声明的强化
120+
+ 未入选特性
121+
+ Concepts
122+
123+
124+
125+
## 许可
126+
127+
<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png" /></a>
128+
129+
本教程由[欧长坤](https://github.com/changkun)撰写,采用[知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)许可。项目中代码使用 MIT 协议开源,参见[许可](../LICENSE)

book/1-intro.md

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# 第一章 C++11/14 简介
2+
3+
4+
## 一、被弃用的特性
5+
6+
在学习 C++1x 之前,我们先了解一下从 C++11 开始,被弃用的主要特性:
7+
8+
> **注意**:弃用不等于废弃,只是用于暗示程序员这些特性将从未来的标准中消失,应该尽量避免使用。但是,已弃用的特性依然是标准库的一部分,并且出于兼容性的考虑,这些特性其实会『永久』保留。
9+
10+
- **如果一个类有析构函数,为其生成拷贝构造函数和拷贝赋值运算符的特性被弃用了。**
11+
12+
- **不再允许字符串字面值常量赋值给一个 `char *`。如果需要用字符串字面值常量赋值和初始化一个 `char *`,应该使用 `const char *` 或者 `auto`**
13+
14+
```cpp
15+
char *str = "hello world!"; // 将出现弃用警告
16+
```
17+
18+
- **C++98 异常说明、 `unexcepted_handler``set_unexpected()` 等相关特性被弃用,应该使用 `noexcept`**
19+
20+
- **`auto_ptr` 被弃用,应使用 `unique_ptr`**
21+
22+
- **`register` 关键字被弃用。**
23+
24+
- **`bool` 类型的 `++` 操作被弃用。**
25+
26+
- **C 语言风格的类型转换被弃用,应该使用 `static_cast``reinterpret_cast``const_cast` 来进行类型转换。**
27+
28+
还有一些其他诸如参数绑定(C++11 提供了 `std::bind``std::function`)、`export` 等特性也均被弃用。前面提到的这些特性**如果你从未使用或者听说过,也请不要尝试去了解他们,应该向新标准靠拢**,直接学习新特性。毕竟,技术是向前发展的。
29+
30+
## 二、与 C 的兼容性
31+
32+
出于一些不可抗力、历史原因,我们不得不在 C++ 中使用一些 C 语言代码(甚至古老的 C 语言代码),例如 Linux 系统调用。在 C++11 出现之前,大部分人当谈及 『C 与 C++ 的区别是什么』时,普遍除了回答面向对象的类特性、泛型编程的模板特性外,就没有其他的看法了,甚至直接回答『差不多』,也是大有人在。下面的韦恩图大致上回答了 C 和 C++ 相关的兼容情况:
33+
34+
![](../assets/comparison.png)
35+
36+
从现在开始,你的脑子里应该树立 **『C++ 不是 C 的一个超集』**这个观念(而且从一开始就不是,后面的进一步阅读的参考文献中给出了 C++98 和 C99 之间的区别)。在编写 C++ 时,也应该尽可能的避免使用诸如 `void*` 之类的程序风格。而在不得不使用 C 时,应该注意使用 `extern "C"` 这种特性,将 C 语言的代码与 C++代码进行分离编译,再统一链接这种做法,例如:
37+
38+
```c
39+
// foo.h
40+
#ifdef __cplusplus
41+
extern "C" {
42+
#endif
43+
44+
int add(int x, int y);
45+
46+
#ifdef __cplusplus
47+
}
48+
#endif
49+
50+
// foo.c
51+
int add(int x, int y) {
52+
reutrn x+y;
53+
}
54+
55+
// main.cpp
56+
#include "foo.h"
57+
int main() {
58+
add(1, 2);
59+
return 0;
60+
}
61+
```
62+
应先使用 `gcc` 编译 C 语言的代码:
63+
64+
```bash
65+
gcc -c foo.c
66+
```
67+
编译出 foo.o 文件,再使用 `g++` 将 C++代码和 `.o` 文件链接起来(或者都编译为 `.o` 再统一链接):
68+
69+
```bash
70+
g++ main.cpp foo.o -o main
71+
```
72+
73+
## 进一步阅读的参考资料
74+
75+
1. C++ 语言导学. Bjarne Stroustrup
76+
2. [C++ 历史](http://en.cppreference.com/w/cpp/language/history)
77+
3. [C++ 1x 特性在 GCC/Clang等编译器中的支持情况](http://en.cppreference.com/w/cpp/compiler_support)
78+
4. [C++98 与 C99 之间的区别](http://david.tribble.com/text/cdiffs.htm#C99-vs-CPP98)
79+
80+
## 许可
81+
82+
<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png" /></a>
83+
84+
本教程由[欧长坤](https://github.com/changkun)撰写,采用[知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)许可。项目中代码使用 MIT 协议开源,参见[许可](../LICENSE)

0 commit comments

Comments
 (0)