This commit is contained in:
Light-City 2020-03-03 09:34:21 +08:00
parent 60af6600e4
commit 50058c3ec2
31 changed files with 185 additions and 178 deletions

121
README.md
View File

@ -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
## 4.多线程与多进程
- [第一章](./c++2.0/./concurrency_v1/chapter1)
- [第二章](./c++2.0/./concurrency_v1/chapter2)
### 4.1 Threading In C++
学习资料https://chenxiaowei.gitbook.io/cpp_concurrency_in_action/
#### 4.2 多线程与多进程
##### 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)
- [堆、栈、RAIIC++里该如何管理资源?](./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<int, int> mp{
{1, 1},
{2, 4},
{3, 9}};
cout << mp << endl;
```
输出结果显示:
```cpp
{ 1 => 1, 2 => 4, 3 => 9 }
```
#### 7.2 像Python一样简单输出
- [像Python一样玩C/C++](./tool/像Python一样玩CC++.md)
#### 7.3 观察编译过程变化
- [https://cppinsights.io](https://cppinsights.io/)
### 8.拓展部分
#### 8.1 一些问题
- [C++中如何将string类型转换为int类型](./basic_content/extent/string_int.md)
### 7.工具篇
- [容器快捷输出工具](./tool/output)
对吴老师的代码进行了修改,[点击此处直通代码](./tool/output/output_container.h)
输入:
```cpp
map<int, int> mp{
{1, 1},
{2, 4},
{3, 9}};
cout << mp << endl;
```
输出结果显示:
```cpp
{ 1 => 1, 2 => 4, 3 => 9 }
```
- 像Python一样简单输出
- [像Python一样玩C/C++](./tool/像Python一样玩CC++.md)
- 观察编译过程变化
- [https://cppinsights.io](https://cppinsights.io/)
### 8.代码运行
### 9.代码运行
- **代码环境**
@ -240,7 +245,7 @@
CLion gcc/g++
### 9.关于作者
### 10.关于作者
个人公众号:

View File

@ -103,3 +103,54 @@ char c3 = static_cast<char>(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来进行访问。
```
枚举常量不会占用对象的存储空间,它们在编译时被全部求值。
枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点。

View File

@ -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来进行访问。
```
枚举常量不会占用对象的存储空间,它们在编译时被全部求值。
枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点。

View File

@ -1,68 +0,0 @@
## C++ 2.0新特性
- [Variadic Templates](variadic)
- Spaces in Template Expressions
```cpp
vector<list<int> > //ok in each C++ version
vector<list<int>> // 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标准

70
c++2.0/c++11/README.md Normal file
View File

@ -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<list<int> > //ok in each C++ version
vector<list<int>> // 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