From 50058c3ec2f35a7a80f6de99a9523ba6ea79e201 Mon Sep 17 00:00:00 2001 From: Light-City <455954986@qq.com> Date: Tue, 3 Mar 2020 09:34:21 +0800 Subject: [PATCH] update --- README.md | 107 +++++++++--------- basic_content/enum/README.md | 51 +++++++++ basic_content/this/README.md | 53 +-------- c++2.0/README.md | 68 ----------- c++2.0/c++11/README.md | 70 ++++++++++++ c++2.0/{ => c++11}/alias.cpp | 0 c++2.0/{ => c++11}/auto.cpp | 0 c++2.0/{ => c++11}/constexpr.cpp | 0 c++2.0/{ => c++11}/decltype.cpp | 0 c++2.0/{ => c++11}/default_delete.cpp | 0 c++2.0/{ => c++11}/explicit.cpp | 0 c++2.0/{ => c++11}/final.cpp | 0 c++2.0/{ => c++11}/hash.cpp | 0 c++2.0/{ => c++11}/initializer.cpp | 0 c++2.0/{ => c++11}/lambda.cpp | 0 c++2.0/{ => c++11}/move.cpp | 0 c++2.0/{ => c++11}/noexcept.cpp | 0 c++2.0/{ => c++11}/nullptr.cpp | 0 c++2.0/{ => c++11}/override.cpp | 0 c++2.0/{ => c++11}/rvalue.cpp | 0 c++2.0/{ => c++11}/template_template.cpp | 0 c++2.0/{ => c++11}/tuple.cpp | 0 c++2.0/{ => c++11}/type_alias.cpp | 0 c++2.0/{ => c++11}/uniform_initialization.cpp | 0 c++2.0/{ => c++11}/variadic/variadic.cpp | 0 c++2.0/{ => c++11}/variadic/variadic1.cpp | 0 c++2.0/{ => c++11}/variadic/variadic2.cpp | 0 c++2.0/{ => c++11}/variadic/variadic3_4.cpp | 0 c++2.0/{ => c++11}/variadic/variadic5.cpp | 0 c++2.0/{ => c++11}/variadic/variadic6.cpp | 0 c++2.0/{ => c++11}/variadic/variadic7.cpp | 0 31 files changed, 178 insertions(+), 171 deletions(-) delete mode 100644 c++2.0/README.md create mode 100644 c++2.0/c++11/README.md rename c++2.0/{ => c++11}/alias.cpp (100%) rename c++2.0/{ => c++11}/auto.cpp (100%) rename c++2.0/{ => c++11}/constexpr.cpp (100%) rename c++2.0/{ => c++11}/decltype.cpp (100%) rename c++2.0/{ => c++11}/default_delete.cpp (100%) rename c++2.0/{ => c++11}/explicit.cpp (100%) rename c++2.0/{ => c++11}/final.cpp (100%) rename c++2.0/{ => c++11}/hash.cpp (100%) rename c++2.0/{ => c++11}/initializer.cpp (100%) rename c++2.0/{ => c++11}/lambda.cpp (100%) rename c++2.0/{ => c++11}/move.cpp (100%) rename c++2.0/{ => c++11}/noexcept.cpp (100%) rename c++2.0/{ => c++11}/nullptr.cpp (100%) rename c++2.0/{ => c++11}/override.cpp (100%) rename c++2.0/{ => c++11}/rvalue.cpp (100%) rename c++2.0/{ => c++11}/template_template.cpp (100%) rename c++2.0/{ => c++11}/tuple.cpp (100%) rename c++2.0/{ => c++11}/type_alias.cpp (100%) rename c++2.0/{ => c++11}/uniform_initialization.cpp (100%) rename c++2.0/{ => c++11}/variadic/variadic.cpp (100%) rename c++2.0/{ => c++11}/variadic/variadic1.cpp (100%) rename c++2.0/{ => c++11}/variadic/variadic2.cpp (100%) rename c++2.0/{ => c++11}/variadic/variadic3_4.cpp (100%) rename c++2.0/{ => c++11}/variadic/variadic5.cpp (100%) rename c++2.0/{ => c++11}/variadic/variadic6.cpp (100%) rename c++2.0/{ => c++11}/variadic/variadic7.cpp (100%) diff --git a/README.md b/README.md index 8ed693fc..bddbfd6d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ 学习C++内容,包括理论、源码、实践、课程代码、项目等。 -### 1.基础部分 +### 1.基础进阶 - [const那些事](./basic_content/const) - [static那些事](./basic_content/static) @@ -34,14 +34,13 @@ --- +### 2.C++2.0新特性 -### 2.进阶部分 +#### 2.0 概况 -#### 2.1 [effective_c++](./effective_c++) +C++2.0简称包括C++11/14/17/20。 -正在更新... - -#### 2.2 [C++2.0新特性](./c++2.0/) +#### 2.1 [C++11新特性](./c++2.0/c++11) - [Variadic Templates](./c++2.0/variadic) @@ -110,14 +109,15 @@ 学习资料:https://www.bilibili.com/video/av51863195?from=search&seid=3610634846288253061 -#### 2.3 [C++并发编程v1](./c++2.0/./concurrency_v1) +### 2.2 C++14/17/20 -- [第一章](./c++2.0/./concurrency_v1/chapter1) -- [第二章](./c++2.0/./concurrency_v1/chapter2) +待更新... -学习资料:https://chenxiaowei.gitbook.io/cpp_concurrency_in_action/ +### 3.设计模式 -#### 2.4 [STL源码剖析](./stl_src) +- [单例模式](./design_pattern/singleton) + +### 4. [STL源码剖析](./stl_src) **stl源码剖析:gcc4.9.1** @@ -137,13 +137,18 @@ - [myhashtable](./stl_src/myhashtable.md) - [unordered_map](./stl_src/unordered_map.md) -## 3.设计模式 +### 4. [并发编程](./c++2.0/./concurrency_v1) -- [单例模式](./design_pattern/singleton) +#### 4.1 C++ Concurrency in Action + +- [第一章](./c++2.0/./concurrency_v1/chapter1) +- [第二章](./c++2.0/./concurrency_v1/chapter2) + +学习资料:https://chenxiaowei.gitbook.io/cpp_concurrency_in_action/ -## 4.多线程与多进程 +#### 4.2 多线程与多进程 -### 4.1 Threading In C++ +##### 4.2.1 Threading In C++ - [介绍](./Threading_In_CPlusPlus/1.thread) - [创建线程的五种类型](./Threading_In_CPlusPlus/2.create_type) @@ -154,9 +159,19 @@ > > https://www.youtube.com/watch?v=eZ8yKZo-PGw&list=PLk6CEY9XxSIAeK-EAh3hB4fgNvYkYmghp&index=4 -### 5.学习课程 +### 5. [C++惯用法](./codingStyleIdioms) -#### 5.1 [极客时间《现代C++实战30讲》](https://time.geekbang.org/channel/home) +##### 你最喜欢的c++编程风格惯用法是什么? + +- [1.类初始化列表](./codingStyleIdioms/1_classInitializers) +- [2.枚举类替换命名空间](./codingStyleIdioms/2_enumclass_namespace) +- [3.RAII(资源获取即初始化)](./codingStyleIdioms/3_RAII) +- [4.copy and swap](./codingStyleIdioms/4_copy-swap) +- [5.pImpl(指针指向具体实现)](./codingStyleIdioms/5_pImpl) + +### 6.学习课程 + +#### 6.1 [极客时间《现代C++实战30讲》](https://time.geekbang.org/channel/home) - [堆、栈、RAII:C++里该如何管理资源?](./modern_C++_30/RAII) - [堆](./modern_++_30/RAII/heap.cpp) @@ -184,53 +199,43 @@ - [函数对象和lambda:进入函数式编程](./modern_C++_30/functionLambda) - [内存模型和atomic:理解并发的复杂性](./modern_C++_30/memorymodel_atomic) -### 6.拓展部分 +### 7.工具篇 -#### 6.1 [C++惯用法](./codingStyleIdioms) +#### 7.1 [容器快捷输出工具](./tool/output) -##### 你最喜欢的c++编程风格惯用法是什么? +对吴老师的代码进行了修改,[点击此处直通代码](./tool/output/output_container.h) -- [1.类初始化列表](./codingStyleIdioms/1_classInitializers) -- [2.枚举类替换命名空间](./codingStyleIdioms/2_enumclass_namespace) -- [3.RAII(资源获取即初始化)](./codingStyleIdioms/3_RAII) -- [4.copy and swap](./codingStyleIdioms/4_copy-swap) -- [5.pImpl(指针指向具体实现)](./codingStyleIdioms/5_pImpl) +输入: -#### 6.2 一些问题 +```cpp +map mp{ + {1, 1}, + {2, 4}, + {3, 9}}; + cout << mp << endl; +``` -- [C++中如何将string类型转换为int类型?](./basic_content/extent/string_int.md) +输出结果显示: -### 7.工具篇 +```cpp +{ 1 => 1, 2 => 4, 3 => 9 } +``` -- [容器快捷输出工具](./tool/output) +#### 7.2 像Python一样简单输出 - 对吴老师的代码进行了修改,[点击此处直通代码](./tool/output/output_container.h) +- [像Python一样玩C/C++](./tool/像Python一样玩CC++.md) - 输入: +#### 7.3 观察编译过程变化 - ```cpp - map mp{ - {1, 1}, - {2, 4}, - {3, 9}}; - cout << mp << endl; - ``` +- [https://cppinsights.io](https://cppinsights.io/) - 输出结果显示: +### 8.拓展部分 - ```cpp - { 1 => 1, 2 => 4, 3 => 9 } - ``` +#### 8.1 一些问题 -- 像Python一样简单输出 - - - [像Python一样玩C/C++](./tool/像Python一样玩CC++.md) - -- 观察编译过程变化 - - - [https://cppinsights.io](https://cppinsights.io/) +- [C++中如何将string类型转换为int类型?](./basic_content/extent/string_int.md) -### 8.代码运行 +### 9.代码运行 - **代码环境** @@ -240,7 +245,7 @@ CLion gcc/g++ -### 9.关于作者 +### 10.关于作者 个人公众号: diff --git a/basic_content/enum/README.md b/basic_content/enum/README.md index b519005d..7ab270c0 100644 --- a/basic_content/enum/README.md +++ b/basic_content/enum/README.md @@ -103,3 +103,54 @@ char c3 = static_cast(Color3::RED); ``` 具体实现见:[classic_practice.cpp](classic_practice.cpp) + +## 类中的枚举类型 + +有时我们希望某些常量只在类中有效。 由于#define 定义的宏常量是全局的,不能达到目的,于是想到实用const 修饰数据成员来实现。而const 数据成员的确是存在的,但其含义却不是我们所期望的。 + +const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其 const 数据成员的值可以不同。 + +不能在类声明中初始化 const 数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道 SIZE 的值是什么。(c++11标准前) + +```c++ +class A +{ + const int SIZE = 100; // 错误,企图在类声明中初始化 const 数据成员 + int array[SIZE]; // 错误,未知的 SIZE +}; +``` + +正确应该在类的构造函数的初始化列表中进行: + +```c++ +class A +{ + A(int size); // 构造函数 + const int SIZE ; +}; +A::A(int size) : SIZE(size) // 构造函数的定义 +{ + +} +A a(100); // 对象 a 的 SIZE 值为 100 +A b(200); // 对象 b 的 SIZE 值为 200 +``` + +怎样才能建立在整个类中都恒定的常量呢? + +别指望 const 数据成员了,应该用类中的枚举常量来实现。例如: + +```c++ +class Person{ +public: + typedef enum { + BOY = 0, + GIRL + }SexType; +}; +//访问的时候通过,Person::BOY或者Person::GIRL来进行访问。 +``` + +枚举常量不会占用对象的存储空间,它们在编译时被全部求值。 + +枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点。 \ No newline at end of file diff --git a/basic_content/this/README.md b/basic_content/this/README.md index 9c7c68b8..f9502373 100644 --- a/basic_content/this/README.md +++ b/basic_content/this/README.md @@ -1,4 +1,4 @@ -# this指针与类中的枚举类型 +# this指针那些事 ## 关于作者 @@ -87,54 +87,3 @@ int main(){ 会发现编译器把上述的this,变为`const A* const`,这个大家也能想到,因为这个函数是const函数,那么针对const函数,它只能访问const变量与const函数,不能修改其他变量的值,所以需要一个this指向不能修改的变量,那就是`const A*`,又由于本身this是`const`指针,所以就为`const A* const`! 总结:this在成员函数的开始执行前构造,在成员的执行结束后清除。上述的get_age函数会被解析成`get_age(const A * const this)`,`add_age`函数会被解析成`add_age(A* const this,int a)`。在C++中类和结构是只有一个区别的:类的成员默认是private,而结构是public。this是类的指针,如果换成结构,那this就是结构的指针了。 - -## 2.类中的枚举类型 - -有时我们希望某些常量只在类中有效。 由于#define 定义的宏常量是全局的,不能达到目的,于是想到实用const 修饰数据成员来实现。而const 数据成员的确是存在的,但其含义却不是我们所期望的。 - -const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其 const 数据成员的值可以不同。 - -不能在类声明中初始化 const 数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道 SIZE 的值是什么。(c++11标准前) - -```c++ -class A -{ - const int SIZE = 100; // 错误,企图在类声明中初始化 const 数据成员 - int array[SIZE]; // 错误,未知的 SIZE -}; -``` - -正确应该在类的构造函数的初始化列表中进行: - -```c++ -class A -{ - A(int size); // 构造函数 - const int SIZE ; -}; -A::A(int size) : SIZE(size) // 构造函数的定义 -{ - -} -A a(100); // 对象 a 的 SIZE 值为 100 -A b(200); // 对象 b 的 SIZE 值为 200 -``` - -怎样才能建立在整个类中都恒定的常量呢? - -别指望 const 数据成员了,应该用类中的枚举常量来实现。例如: - -```c++ -class Person{ -public: - typedef enum { - BOY = 0, - GIRL - }SexType; -}; -//访问的时候通过,Person::BOY或者Person::GIRL来进行访问。 -``` - -枚举常量不会占用对象的存储空间,它们在编译时被全部求值。 - -枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点。 \ No newline at end of file diff --git a/c++2.0/README.md b/c++2.0/README.md deleted file mode 100644 index 03a61fa8..00000000 --- a/c++2.0/README.md +++ /dev/null @@ -1,68 +0,0 @@ -## C++ 2.0新特性 - -- [Variadic Templates](variadic) - -- Spaces in Template Expressions - -```cpp -vector > //ok in each C++ version -vector> // before c++ 11 error error: ‘>>’ should be ‘> >’ within a nested template argument list,c++11后可以正常通过 -``` - -- [nullptr and nullptr_t](nullptr.cpp) - -- [Automatic Type Deduction with auto](auto.cpp) - -- [Uniform Initialization ](uniform_initialization.cpp) - -- [initializer_list](initializer.cpp) - -- [explicit for ctors taking more than one argument](explicit.cpp) - -- [range-based for statement](auto.cpp) - -```cpp -for(decl:col) { - statement -} -``` - -- [=default,=delete](default_delete.cpp) - - 如果你自行定义了一个ctor,那么编译器就不会给你一个default ctor - 如果强制加上=default,就可以重新获得并使用default ctor. - -- Alias(化名)Template(template typedef) - -[alias.cpp](alias.cpp) - -[template_template.cpp](template_template.cpp) - -- [template template parameter](template_template.cpp) - -- [type alias](type_alias.cpp) - -- [noexcept](noexcept.cpp) -- [override](override.cpp) -- [final](final.cpp) -- [decltype](decltype.cpp) - -- [lambda](lambda.cpp) - -- [Rvalue reference](rvalue.cpp) - -- [move aware class](move.cpp) - -- 容器-结构与分类 - -(1) 序列式容器包括:array(C++2.0新引入),vector,deque,list,forward_list(C++2.0新引入) - -(2) 关联式容器包括:set/multiset,map/multimap - -(3) 无序容器(C++2.0新引入,更换原先hash_xxx为unordered_xxx)包括:unordered_map/unordered_multimap,unordered_set/unordered_multiset - -- [Hash Function](hash.cpp) - -- [tuple](tuple.cpp) - -学习自侯捷C++11标准 \ No newline at end of file diff --git a/c++2.0/c++11/README.md b/c++2.0/c++11/README.md new file mode 100644 index 00000000..27b9e958 --- /dev/null +++ b/c++2.0/c++11/README.md @@ -0,0 +1,70 @@ +# C++新特性 + +## 1.[C++11新特性](./c++2.0/c++11) + +- [Variadic Templates](./c++2.0/variadic) + +- Spaces in Template Expressions + + ```cpp + vector > //ok in each C++ version + vector> // before c++ 11 error error: ‘>>’ should be ‘> >’ within a nested template argument list,c++11后可以正常通过 + ``` + +- [nullptr and nullptr_t](./c++2.0/nullptr.cpp) + +- [Automatic Type Deduction with auto](./c++2.0/auto.cpp) + +- [Uniform Initialization ](./c++2.0/uniform_initialization.cpp) + +- [initializer_list](./c++2.0/initializer.cpp) + +- [explicit for ctors taking more than one argument](./c++2.0/explicit.cpp) + +- [range-based for statement](./c++2.0/auto.cpp) + + ```cpp + for(decl:col) { + statement + } + ``` + +- [=default,=delete](./c++2.0/default_delete.cpp) + + 如果你自行定义了一个ctor,那么编译器就不会给你一个default ctor + 如果强制加上=default,就可以重新获得并使用default ctor. + +- Alias(化名)Template(template typedef) + + - [alias.cpp](./c++2.0/alias.cpp) + - [template_template.cpp](./c++2.0/template_template.cpp) + +- [template template parameter](./c++2.0/template_template.cpp) + +- [type alias](./c++2.0/type_alias.cpp) + +- [noexcept](./c++2.0/noexcept.cpp) + +- [override](./c++2.0/override.cpp) + +- [final](./c++2.0/final.cpp) + +- [decltype](./c++2.0/decltype.cpp) + +- [lambda](./c++2.0/lambda.cpp) + +- [Rvalue reference](./c++2.0/rvalue.cpp) + +- [move aware class](./c++2.0/move.cpp) + +- 容器-结构与分类 + + - (1) 序列式容器包括:array(C++2.0新引入),vector,deque,list,forward_list(C++2.0新引入) + - (2) 关联式容器包括:set/multiset,map/multimap + - (3) 无序容器(C++2.0新引入,更换原先hash_xxx为unordered_xxx)包括:unordered_map/unordered_multimap,unordered_set/unordered_multiset + +- [Hash Function](./c++2.0/hash.cpp) + +- [tuple](./c++2.0/tuple.cpp) + + 学习资料:https://www.bilibili.com/video/av51863195?from=search&seid=3610634846288253061 \ No newline at end of file diff --git a/c++2.0/alias.cpp b/c++2.0/c++11/alias.cpp similarity index 100% rename from c++2.0/alias.cpp rename to c++2.0/c++11/alias.cpp diff --git a/c++2.0/auto.cpp b/c++2.0/c++11/auto.cpp similarity index 100% rename from c++2.0/auto.cpp rename to c++2.0/c++11/auto.cpp diff --git a/c++2.0/constexpr.cpp b/c++2.0/c++11/constexpr.cpp similarity index 100% rename from c++2.0/constexpr.cpp rename to c++2.0/c++11/constexpr.cpp diff --git a/c++2.0/decltype.cpp b/c++2.0/c++11/decltype.cpp similarity index 100% rename from c++2.0/decltype.cpp rename to c++2.0/c++11/decltype.cpp diff --git a/c++2.0/default_delete.cpp b/c++2.0/c++11/default_delete.cpp similarity index 100% rename from c++2.0/default_delete.cpp rename to c++2.0/c++11/default_delete.cpp diff --git a/c++2.0/explicit.cpp b/c++2.0/c++11/explicit.cpp similarity index 100% rename from c++2.0/explicit.cpp rename to c++2.0/c++11/explicit.cpp diff --git a/c++2.0/final.cpp b/c++2.0/c++11/final.cpp similarity index 100% rename from c++2.0/final.cpp rename to c++2.0/c++11/final.cpp diff --git a/c++2.0/hash.cpp b/c++2.0/c++11/hash.cpp similarity index 100% rename from c++2.0/hash.cpp rename to c++2.0/c++11/hash.cpp diff --git a/c++2.0/initializer.cpp b/c++2.0/c++11/initializer.cpp similarity index 100% rename from c++2.0/initializer.cpp rename to c++2.0/c++11/initializer.cpp diff --git a/c++2.0/lambda.cpp b/c++2.0/c++11/lambda.cpp similarity index 100% rename from c++2.0/lambda.cpp rename to c++2.0/c++11/lambda.cpp diff --git a/c++2.0/move.cpp b/c++2.0/c++11/move.cpp similarity index 100% rename from c++2.0/move.cpp rename to c++2.0/c++11/move.cpp diff --git a/c++2.0/noexcept.cpp b/c++2.0/c++11/noexcept.cpp similarity index 100% rename from c++2.0/noexcept.cpp rename to c++2.0/c++11/noexcept.cpp diff --git a/c++2.0/nullptr.cpp b/c++2.0/c++11/nullptr.cpp similarity index 100% rename from c++2.0/nullptr.cpp rename to c++2.0/c++11/nullptr.cpp diff --git a/c++2.0/override.cpp b/c++2.0/c++11/override.cpp similarity index 100% rename from c++2.0/override.cpp rename to c++2.0/c++11/override.cpp diff --git a/c++2.0/rvalue.cpp b/c++2.0/c++11/rvalue.cpp similarity index 100% rename from c++2.0/rvalue.cpp rename to c++2.0/c++11/rvalue.cpp diff --git a/c++2.0/template_template.cpp b/c++2.0/c++11/template_template.cpp similarity index 100% rename from c++2.0/template_template.cpp rename to c++2.0/c++11/template_template.cpp diff --git a/c++2.0/tuple.cpp b/c++2.0/c++11/tuple.cpp similarity index 100% rename from c++2.0/tuple.cpp rename to c++2.0/c++11/tuple.cpp diff --git a/c++2.0/type_alias.cpp b/c++2.0/c++11/type_alias.cpp similarity index 100% rename from c++2.0/type_alias.cpp rename to c++2.0/c++11/type_alias.cpp diff --git a/c++2.0/uniform_initialization.cpp b/c++2.0/c++11/uniform_initialization.cpp similarity index 100% rename from c++2.0/uniform_initialization.cpp rename to c++2.0/c++11/uniform_initialization.cpp diff --git a/c++2.0/variadic/variadic.cpp b/c++2.0/c++11/variadic/variadic.cpp similarity index 100% rename from c++2.0/variadic/variadic.cpp rename to c++2.0/c++11/variadic/variadic.cpp diff --git a/c++2.0/variadic/variadic1.cpp b/c++2.0/c++11/variadic/variadic1.cpp similarity index 100% rename from c++2.0/variadic/variadic1.cpp rename to c++2.0/c++11/variadic/variadic1.cpp diff --git a/c++2.0/variadic/variadic2.cpp b/c++2.0/c++11/variadic/variadic2.cpp similarity index 100% rename from c++2.0/variadic/variadic2.cpp rename to c++2.0/c++11/variadic/variadic2.cpp diff --git a/c++2.0/variadic/variadic3_4.cpp b/c++2.0/c++11/variadic/variadic3_4.cpp similarity index 100% rename from c++2.0/variadic/variadic3_4.cpp rename to c++2.0/c++11/variadic/variadic3_4.cpp diff --git a/c++2.0/variadic/variadic5.cpp b/c++2.0/c++11/variadic/variadic5.cpp similarity index 100% rename from c++2.0/variadic/variadic5.cpp rename to c++2.0/c++11/variadic/variadic5.cpp diff --git a/c++2.0/variadic/variadic6.cpp b/c++2.0/c++11/variadic/variadic6.cpp similarity index 100% rename from c++2.0/variadic/variadic6.cpp rename to c++2.0/c++11/variadic/variadic6.cpp diff --git a/c++2.0/variadic/variadic7.cpp b/c++2.0/c++11/variadic/variadic7.cpp similarity index 100% rename from c++2.0/variadic/variadic7.cpp rename to c++2.0/c++11/variadic/variadic7.cpp