Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit e005c2e

Browse filesBrowse files
committed
add book files
1 parent 71025d8 commit e005c2e
Copy full SHA for e005c2e

File tree

Expand file treeCollapse file tree

12 files changed

+2473
-10
lines changed
Filter options
Expand file treeCollapse file tree

12 files changed

+2473
-10
lines changed

‎README.md

Copy file name to clipboardExpand all lines: README.md
+6-10Lines changed: 6 additions & 10 deletions
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

Copy file name to clipboard
584 Bytes
Loading

‎book/0-preface.md

Copy file name to clipboard
+129Lines changed: 129 additions & 0 deletions
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

Copy file name to clipboard
+84Lines changed: 84 additions & 0 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.