# 現代C++簡介, 第一步
###### tags: `CPP`
- [slide: https://hackmd.io/@ewnlm/B1kqKh0wa ] <!-- Put the link to this slide here so people can follow -->
---
## 快速入手 C++. Part1
- 初始化
- 宣告與定義
- 基本資料型態
- 容器
- Range-based for loop
- Lambda Function
---
### 前言
C++是 ISO 工業標準,也是有標準文件規範。
但為了快速上手🤨,先分享規則跟經驗.
時間允許的話,建議還是好好看一下官方文件:writing_hand:.
可以由中文先入手,但新資訊還是以英文多,建議多看原文。
---
### C++之父 Bjarne Stroutstrup
CppCon2023
{%youtube I8UvQKvOSSw %}
---
### 初始化
- 初始化是C++很重要的特色之一, 包含之後會遇到的 class.
- [RAII](https://zh.wikipedia.org/zh-tw/RAII) (Resource Acquisition Is Initialization) 資源取得即初始化
```cpp=
int number_a (10); // (V) Direct initialization
int number_b {10}; // (V) List initialization
int number_c = 10; // Copy initialization
```
---
### 宣告與定義
C/C++ _forward declaration_
所有要用到的變數,函數,結構等,都要事先宣告或定義才能使用。
- Declaration 宣告,跟整支程式聲明變數存在,但不需初始化。
- Definition 定義。類似宣告,一定要初始化。
----
#### 範例
```cpp!
\\ File: variable.h
extern int number_a ;
\\ File: variable.cpp
int number_a (10);
```
- 會把全域變數宣告在 H file, 讓有需要的CPP file include.
- extern 宣告(declaration)有這個變數,但定義(definition)在其他的檔案.
---
### 基本資料型態
#### auto
- C++11 新功能。
- 定義變數時,藉由rvalue,推算變數的正確資料型態。
- 省略繁雜的資料型態,只要寫 auto 就好 👍
- 延伸閱讀 [decltype](https://en.cppreference.com/w/cpp/language/decltype)
----
##### 範例
```cpp=
auto _int_val (10); // int _int_val (10);
auto _uint_val (10u); // unsigned int _uint_val (10);
auto _float_val (10.0f); // float _float_val (10.0);
auto _double_val (10.0); // double _double_val (10.0);
vector<string> data;
auto it = data.begin(); // vector<string>::iterator it;
```
- 延伸閱讀 [integer literal](https://en.cppreference.com/w/cpp/language/integer_literal)
- [floating literal](https://en.cppreference.com/w/cpp/language/floating_literal)
- [string literal](https://en.cppreference.com/w/cpp/language/string_literal)
- [value category](https://en.cppreference.com/w/cpp/language/value_category)
----
#### \<cstdint\> C++11
\<cstdint\> library 提供指定長度的int, unsigned int.
C++保證在不同平台上,都能維持你所指定的長度。
- int8_t, int16_t, int32_t, int64_t
- uint8_t, uint16_t, uint32_t, uint64_t
---
#### Range-based for loop
- C++11 新功能。
```cpp=
for(auto it (vec.begin()); it!=vec.end(); it++) {}
for(auto it: vec) {}
map<string, int> box_office {{"movie1", 1'200'000},
{"movie2", 1'100'000},
{"movie3", 1'500'000}};
for(auto [name, performance]: box_office) { } // C++17
```
如果要**從頭到尾**瀏覽陣列或容器,可以考慮 range-based for loop.
---
#### Pointer 指標
```cpp=
auto var (10);
auto *var_ptr (&var);
auto **ptr_to_ptr (&var_ptr);
int *var_ptr2; // un-initialization
```
- 儲存位址的變數。
- & address of. 取得變數的實際位址。
- \* value of. 間接存取變數內容,指標是紀錄其他變數的位址,對指標使用 value of operator, 就可以存取變數內的值。
----
#### Pointer 指標
```cpp=
auto var2 (20);
auto var3 (30);
var_ptr2 = &var2;
var_ptr2 = &var3;
var_ptr2 = nullptr;
```
- 指標可以任意綁定同型態的變數。
- 關鍵字`nullptr`. 可以指定給*任意型態*的指標,有點歸零的意味。
----
#### Pointer 指標
- 每個程式被作業系統分配在RAM後,還會被分成四個區域。
- Code/Static and Global/Stack/Heap.
- 函式(Function)會放在記憶體Stack區域.
- Stack用來儲存函式呼叫的位址以及區域變數,使用後,空間會被釋放。
- 可以解釋為什麼函式內宣告的變數會消失。
- 延伸閱讀 [作業系統 Data segment](https://en.wikipedia.org/wiki/Data_segment)
----
#### Pointer 指標
```cpp=
typedef int (*Fptr)(int , int);
int _add(int ain, int bin) { return ain+bin; }
int _sub(int ain, int bin) { return ain-bin; }
int main() {
Fptr fptr;
fptr = _add;
printf("Func: %d\n", fptr(3, 2)); // 5
fptr = _sub;
printf("Func: %d\n", fptr(3, 2)); // 1
}
```
- 函式當指標看待,可以任意綁定**同類型函式**.
---
#### Reference 參考
```cpp=
auto var (10);
auto &var_ref (var);
```
- 與指標相比,參考唯一的差別是初始化時必要就綁定變數。
- 以及綁定後不能更換。
- 延伸閱讀 [value category](https://en.cppreference.com/w/cpp/language/value_category), [move](https://en.cppreference.com/w/cpp/utility/move)
---
### 容器 (Container)
- 循序式容器 Sequence containers
- vector
- list
- 關聯式容器 Associative
- map
- unordered_map
- 延伸閱讀[container library](https://en.cppreference.com/w/cpp/container)
----
### 容器 (Container)
- 容器 class template.
- class 自訂複合式資料型態,可以儲存資料,也可以做運算;類似C語言的struct.
- template模版,寫出方法而且適合各資料型態。
- 搭配<algorithm>可以幫你節省很多時間。
---
---
### Thank you! :sheep:
You can find me on
- GitHub
- Twitter
- or email me
{"contributors":"[{\"id\":\"0b93a0f4-2322-4e3e-9569-2c17e87a9819\",\"add\":7740,\"del\":2869}]","showTags":"true","title":"Brief of C++. 1st move","description":"Brief of CPP Language"}