Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
Light-City committed Mar 3, 2020
1 parent 60af660 commit 50058c3
Show file tree
Hide file tree
Showing 31 changed files with 178 additions and 171 deletions.
107 changes: 56 additions & 51 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

学习C++内容,包括理论、源码、实践、课程代码、项目等。

### 1.基础部分
### 1.基础进阶

- [const那些事](./basic_content/const)
- [static那些事](./basic_content/static)
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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**
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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;
```

- [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<int, int> 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.代码运行
- **代码环境**
Expand All @@ -240,7 +245,7 @@
CLion gcc/g++
### 9.关于作者
### 10.关于作者
个人公众号:
Expand Down
51 changes: 51 additions & 0 deletions basic_content/enum/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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来进行访问。
```

枚举常量不会占用对象的存储空间,它们在编译时被全部求值。

枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点。
53 changes: 1 addition & 52 deletions basic_content/this/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# this指针与类中的枚举类型
# this指针那些事

## 关于作者

Expand Down Expand Up @@ -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来进行访问。
```

枚举常量不会占用对象的存储空间,它们在编译时被全部求值。

枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点。
68 changes: 0 additions & 68 deletions c++2.0/README.md

This file was deleted.

Loading

0 comments on commit 50058c3

Please sign in to comment.