# 現代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"}
    204 views