--- disqus: jexus-md --- C++, C Memo === > [TOC] ## 1. Annoying Chores ### static_cast vs. dynamic_cast: 資料類型轉換 ```c++ static_cast <type> ( expression ) //將 expression 轉換為type的類型 ``` dynamic --> runtime 才去 cast static --> compile time 就幫你試過 ### setw: 向右對齊 (non-sticky) ```c++ #include <iomanip> cout << setw(字元格子寬度) << "字元"; //字元會右貼,但超過寬度沒反應 ``` 其他所有Manipulators都是sticky ### setprecision: 總有效位數 ```c++ #include <iomanip> cout << setprecision(輸出總位數) << 變數/數字; //會一直影響後面輸出 ``` ### fixed+setprecision: 小數點後位數 ```c++ #include <iomanip> cout << fixed << setprecision(輸出小數位數) << 變數/數字; //可用cout.unsetf( ios::fixed )關閉fixed //但setprecision關不掉 -->sticky //cout物件被setprecision sticky //hex可以用dec解除 ``` ### Binary Operation: 位元運算 **位元AND運算(&), 位元OR運算(|), 位元XOR運算(^)** >將原先的資料型別換成二進位表示之後再做運算 ### [fstream 用法](https://hackmd.io/s/ry4GNk78-) >https://hackmd.io/s/ry4GNk78- ### to_string 沒定義 ( int -> string ) >error: 'to_string' was not declared in this scope **自己寫:** ```clike= std::string to_string(int i) { std::stringstream ss; ss << i; return ss.str(); } ``` ### string char* 互換 ```c= //char* <- string char *charname = stringname.c_str(); //string <- char string stringname(charArrayName); //or string stringname = charArrayName; // assign directly to a string. ``` ### stringstream is empty? check if `myStream.rdbuf()->in_avail() == 0` >https://stackoverflow.com/questions/8046357/how-do-i-check-if-a-stringstream-variable-is-empty-null ### cin/ cin.get()/ cin.getline() - cin 的结束符有:[enter] [space] [tab] - cin.get()的结束符只有:[enter],但会把enter放入队列等待 - cin.getline()的结束符也只有:[enter],但不会把enter放入队列 **cin.get() 有三种格式** 无参,一参数,二参数 `cin.get() , cin.get(char ch) , cin.get(array_name,Arsize)` **cin.getline()只有一种格式** `cin.getline(array_name,Arsize)` ## \r\n 問題 Unix系統--------->“\n”; Windows系統---->“\r\n”; Mac系統--------->“\r”。 一個直接後果是,Unix/Mac系統下的文件在Windows裡打開的話,所有文字會變成一行; 而Windows裡的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號。 ### Stand Input Output 標準輸出輸入 - printf() 執行後會return所輸出的字元數 - 標準輸出可以用 > 將輸出結果導向至指定檔案 ``` filename > result.txt ``` - 執行會將print出的東西導向至 result.txt,螢幕上不再顯示。 - 重新導向標準輸出用 > ,標準輸入則是 < - 附加重導標準輸出用 >> ,效果同append |format specifier|meaning| |---|---| |%c |char| |%d |10 進位 int| |%o | 8 進位 int| |%u |unsign int| |%x, %X |將int以 16 進位方式輸出</br>(x大小寫決定英文字輸出大小寫)| |%f |float| |%e, %E |用科學記號顯示float</br>(e大小寫決定英文字e輸出大小寫)| |%g, %G | 等同使用 %f 或 %e(%f 或 %E)</br>兩方案電腦自行判斷哪個表示精簡| |%% |顯示 %| |%s |string| |%lu |long unsigned 型態的整數| |%p |pointer| - 輸出浮點數指定精度: `printf("example:%.2f\n", 19.234);` %.2f 指定小數點後取兩位 - 靠右對齊: `printf("example:%6.2f\n", 19.234);` %6f 預留 6 個字元寬度 - 靠左對齊: `printf("example:%-6.2f\n", 19.234);` 加負號 - 預留的寬度想用變數: `printf("example:%*f\n", x, 19.234);` 用* - scanf() ```c int input; printf("請輸入數字:"); scanf("%d", &input); ``` 若已是字元陣列就不用 & 取址 - regex效果: ```c int number1, number2; printf("請再輸入兩個數字,中間使用-號區隔):"); scanf("%d-%d", &number1, &number2); printf("您輸入的數字:%d-%d\n", number1, number2); ``` ```c char str[50]; printf("請輸入 1 到 5 的字元:"); scanf("%[1-5]", str); printf("輸入的字元為 %s\n", str); fflush(stdin); // 清除輸入緩衝區 printf("請輸入 XYZ 任一字元:"); scanf("%[XYZ]", str); printf("輸入的字元為 %s\n", str); ``` - scanf() 函式連續讀入符合集合的字元並放到字元陣列中,直到讀到不符合的字元為止,剩下的字元仍會存在輸入緩衝區中 - 可以直接使用 fflush(stdin) 清除輸入緩衝區 - scanf() 函式若成功,則傳回成功填寫的格式指定字數目,否則直接略過輸入而傳回 0 > https://openhome.cc/Gossip/CGossip/PrintfScanf.html - sscanf & ssprintf http://ccckmit.wikidot.com/cp:sscanf ## 2. Ostream Operator Overloading **重載資料流運算子** ```c++ friend ostream &operator<<(ostream& orz,const jector &in){ orz<<"("<<in.x<<","<<in.y<<")"<<endl; return orz; } ``` ## 3. const成員函數 **若Object是宣告為const,則只能執行const member function** ```c++ void func( ) const; ``` default argument 只能出現一次 ## 4. Proxy Class ```c interface(int a):ptr(new implmentation(a)){ //empty } ``` ## 5. uint8_t, uint16_t, uint32_t, uint64_t ```cpp uint8_t 義同 unsigned char uint16_t 義同 unsigned short uint32_t 義同 unsigned int uint64_t 義同 unsigned long long ``` >https://pinglinblog.wordpress.com/2014/01/16/ctype-uint8_t-uint16_t-uint32_t-uint64_t/ ## 6. C/C++ typedef , struct , typedef struct > [time=Sun, Aug 13, 2017 12:37 PM] ### typedef: 型別取名 ```cpp typedef int Jack; // 幫int取名叫Jack Jack age; // age的型別是 int ``` ### struct: 結構 ```cpp struct family{ int Ken; float Sam; }; //別忘了結尾要加分號 ``` :::danger C和C++在宣告結構的變數時不同 ::: * C比較嚴謹: ```cpp struct family Chen; //Chen的型別是family這個結構 //family的型別是struct ``` * C++: ``` family Chen; //Chen的型別是family這個結構 ``` :::success 宣告結構時一起宣告變數 C和C++沒差 ::: ```cpp struct family{ int Ken; float Sam; }; Chen //Chen的型別是family這個結構 ``` * 呼叫成員 `Chen.Ken=10; //設定Ken=10;` ### typedef struct - 結合 typedef 和 struct直接幫結構命名,C和C++都一樣: ```cpp typedef struct family{ int Ken; float Sam; }Asia; //把family這個結構命名為Asia ``` - 建立family的結構變數: ```cpp Asia Chen; //沒加typedef之前,要用family Chen宣告 ``` - 呼叫成員 ` Chen.Sam=10.5; ` polymorphism 也可以傳reference base class 的 destructor 前面要加virtual > http://vincecc.blogspot.tw/2013/10/cc-typedef-struct-typedef-struct.html ## <p><div style="font-size:0.8em">查看我的其他筆記 — — <a href="https://hackmd.io/@voidism">回到 Jexus.md 首頁</a></div></p>