---
# System prepended metadata

title: c/c++

---


# c/c++
[新的](https://continuous-air-7f3.notion.site/program-88cf601cfc82449d98253cbe2e334bff)
# [學習程式:實踐者的方法](https://jasonblog.github.io/note/c++/xue_xi_c_ff1a_shi_jian_zhe_de_fang_fa_ff08_beta1.html)
::: warning

## [c++控制台操作](https://www.cnblogs.com/flowingwind/p/8159035.html)
## [亂數1](https://edisonx.pixnet.net/blog/post/91314418)    [亂數2](http://it-life.puckwang.com/2016/03/ccrandsrand.html)

:::

::: warning


## [int *p=a和int *p=&a有什么区别？](https://zhidao.baidu.com/question/485583430.html)
int *p=&a 其实是两个语句 等价于 int *p; p=&a
:::

::: warning


## [static local arrays and automatic local arrays](https://openhome.cc/Gossip/CGossip/Scope.html)

* 靜態陣列就算沒初始化，也設為0
* 放在 main 外的變數也是
:::
::: warning

## [extern 1](https://chenhh.gitbooks.io/parallel_processing/content/cython/c_syntax.html)   [extern 2](https://meetonfriday.com/posts/9514e1a0/)

如果要使用在其他原始檔中定義的全域性變數，應該使用關鍵字 extern 來宣告
:::



::: warning



## [assert](https://www.runoob.com/w3cnote/c-assert.html)
:::


::: warning

##  [x++ and ++x](http://weisnote.blogspot.com/2011/11/x-x.html )
*  [++x(Prefix Increment)的overload - Point& Point::operator++()](https://docs.microsoft.com/zh-tw/cpp/cpp/increment-and-decrement-operator-overloading-cpp?view=msvc-170)
* [x++(Postfix Increment)的overload - Point Point::operator++(int)](https://docs.microsoft.com/zh-tw/cpp/cpp/increment-and-decrement-operator-overloading-cpp?view=msvc-170)

x++ 就是會先與其他算式運算 之後才 x = x + 1 將x值增1

++x 就是先 x = x + 1 將x值增1 之後才與其他算式運算

可以記
10*x++ = (x先乘10)在加1
10*++x = (x先加1)在乘10
:::

:::warning

## [const / volatile](https://chenhh.gitbooks.io/parallel_processing/content/cython/c_syntax.html)

:::
:::warning

## [struct](https://opensourcedoc.com/c-programming/struct/)
:::


:::warning

## [<curses.h> 1](http://epaper.gotop.com.tw/pdf/AXP009600.pdf)      [<curses.h> 2](https://www.itread01.com/content/1546827516.html)

:::


:::warning


## [linked-list的建立與刪除](https://kopu.chat/c-%E8%AA%9E%E8%A8%80%EF%BC%9A%E9%8F%88%E7%B5%90%E4%B8%B2%E5%88%97linked-list%E7%9A%84%E5%BB%BA%E7%AB%8B%E8%88%87%E5%88%AA%E9%99%A4/)
:::
:::warning


## [IEEE 754](https://medium.com/starbugs/see-why-floating-point-error-can-not-be-avoided-from-ieee-754-809720b32175)
把數字標準化，一定要leading with 1 ，leading 1不用放進fraction的格子裡，換回浮點數要記得放回去。
![](https://i.imgur.com/FsOFqww.png)
:::








:::warning


## [return *this和return this的區別](https://www.itread01.com/content/1547744593.html)

假如定義temp *get(){return this;}，那麼返回的this就是地址，即返回一個指向物件的指標
假如定義temp get(){return *this;} 那麼返回的就是物件的克隆，是一個臨時變數
假如定義temp &get(){return *this;} 那麼返回的就是物件本身
:::

:::warning

## [friend function 1   /](https://course.ipv6.club.tw/C_Programming/991/Code/Ch07/Ex7_08.cpp)              [friend function 2](https://www.section.io/engineering-education/introduction-to-friend-functions-in-c++/)

:::

:::warning


## [Pass by value vs Pass by reference](https://medium.com/@racktar7743/c-c-%E6%8C%87%E6%A8%99%E6%95%99%E5%AD%B8-%E5%9B%9B-pass-by-value-vs-pass-by-reference-ed5882802789)

 [任何型態皆可用C++新提出的reference傳進function](https://www.cnblogs.com/oomusou/archive/2007/02/09/645944.html)
* array 也可以
- void func(int (&arr)[3])
- &arr一定要括號，因為[]比&優先權高
- compiler只對array的型態做檢查，就算傳進function時指定了array size，compiler也會忽略，但若使用reference，compiler則會對array size做檢查(須要將array size寫死)

:::
:::warning

## [Return by reference ](https://www.geeksforgeeks.org/return-by-reference-in-c-with-examples/) 
* **能讓return的東西變成左值**
*  ==**return by reference不能回傳區域變數，因為他用完之後就消失了，會造成不可預期的結果(要用到區域變數能用[new](https://openhome.cc/Gossip/CppGossip/newDelete.html))**。==
* **注意int& b = a 的意思 (會讓a,b的記憶體位置相同)**

:::success
```cpp=
    int a=3;
    // 比較兩個的差別
    int& b =a;
    int c=a;

cout << a<<b<<c << endl<<&a<< endl<<&b<< endl<<&c;

```
    


:::



::: warning


## [copy consturctor](https://www.itread01.com/content/1548766986.html)

:::
:::warning

## [#include < string > ](https://www.cplusplus.com/reference/string/string/find/)
### find()
* size_t find (const char* s, size_t pos, size_type n)
* If no matches were found, the function returns string::npos.
:::




:::warning

## [NULL 、 0 、 '\0' 、 “0” 、 "\0"](https://zhuanlan.zhihu.com/p/79210633)
:::
:::warning

## [指標與字串](https://openhome.cc/Gossip/CGossip/PointerAndString.html)
是唯讀的不可跟改，建議加上const
:::



## [函式指標](https://openhome.cc/Gossip/CppGossip/FunctionPointer.html)


:::warning
## [void*](https://www.itread01.com/content/1546747742.html)


void *也可以無需強制型別轉換地賦給其它型別的指標。因為“無型別”可以包容“有型別”，而“有型別”則不能包容“無型別”。

函數fun1 指定給 fun2，等效於 &fun1 指定給 function2，在指定之後，fun2 儲存了 fun1 的位址，在呼叫時，fun1(20) 等效於 (*fun1)(20)
:::
::: warning


## c++  functional

???
:::
:::warning
## [為自訂類別多載 << 運算子 /](https://docs.microsoft.com/zh-tw/cpp/standard-library/overloading-the-output-operator-for-your-own-classes?view=msvc-170) [為自訂類別多載 << 運算子](https://www.coursera.org/lecture/cpp-chengxu-sheji/liu-cha-ru-yun-suan-fu-he-liu-ti-qu-yun-suan-fu-de-zhong-zai-c3tbl)

輸出資料流針對標準類型使用插入 (<<) 運算子。也可以為您的自訂類別多載 << 運算子。
:::

:::warning
## Lvalue reference variables

???
For those of you already familiar with pointers, the ampersand in this context does not mean “address of”, it means “lvalue reference to”.
:::
:::warning
## [< time.h >](https://linux.die.net/man/3/ctime)
:::


:::warning
## [pointer to pointer (**p)](http://low-understated.blogspot.com/2009/04/pointer-to-pointer.html)

**p用來儲存pointer的位置
![](https://i.imgur.com/6raaQyR.png)
![](https://i.imgur.com/HAmROwo.png)





:::warning
:::info
兩篇對著看  #可以點圖片


第一張是把num1的位置傳進setNum，*num2也指向num1，所以*num2改了原本的質也會改
[![](https://i.imgur.com/uFi6NaX.png)](https://medium.com/@racktar7743/c-c-%E6%8C%87%E6%A8%99%E6%95%99%E5%AD%B8-%E5%9B%9B-pass-by-value-vs-pass-by-reference-ed5882802789)

第二張*pInt和*localPtr都指向local_int，因為changePtr的pInt是localPtr的複本, 對pInt做變更, 其實並不會影響到localPtr本身，印出來的數值仍為1
[![](https://i.imgur.com/vFzWYZ4.png)](http://low-understated.blogspot.com/2009/04/pointer-to-pointer.html)

但是如果我們要改變的不是pointer所指向的實體的值，而是pointer本身的值，那就把pointer當作一種type，再把它的address傳到funtion的double pointer。
[![](https://i.imgur.com/BobFQTV.png)](http://low-understated.blogspot.com/2009/04/pointer-to-pointer.html)
印出來的數值變為gint的0
:::


:::warning
## 函式多載規則

* **多個函式定義使用相同的函式名稱**
* **函式參數的數量或類型必須有區別**
:::



:::warning
## sizeof()

 * **用bite顯示**
 * **重要:在64位元電腦中，任何資料型態之指標變數所佔記憶體大小均為 8 bytes。**
 * [**size of struct**](https://www.geeksforgeeks.org/is-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member/)
 * [class 內的成員如果加上關鍵字static則不占class的空間](https://stackoverflow.com/questions/4842056/do-static-members-of-a-class-occupy-memory-if-no-object-of-that-class-is-created)
:::



:::warning
## [class 內的成員如果加上關鍵字static則不占class的空間](https://stackoverflow.com/questions/4842056/do-static-members-of-a-class-occupy-memory-if-no-object-of-that-class-is-created)
size of A and B is exactly the same.
![](https://i.imgur.com/q3LCkuT.png)
:::

 

:::warning
 
## [c++檔案讀寫 <fstream>](https://hackmd.io/@ndhu-programming-2021/BkZukG4jK)
:::

:::warning
## [new 與 delete](https://openhome.cc/Gossip/CppGossip/newDelete.html)
* 用來存函數內的東西好用
:::
:::danger
# 處理文本
:::
:::warning

處理string特好用
## [ <sstream> ](https://www.796t.com/content/1549657646.html)
* 用它進行string與各種內建型別資料之間的轉換
* ostringstream類向一個string插入字元。
* istringstream類從一個string物件讀取字元。
## [stream](https://www.796t.com/content/1549657646.html)    

    
:::
:::warning

## [字串 1 /](https://mycollegenotebook.medium.com/c-%E8%AA%9E%E8%A8%80%E7%AD%86%E8%A8%98-%E5%AD%97%E4%B8%B2-strings-ffe70ee5f5b8)[字串 2](https://www.796t.com/post/OTg5NGE=.html)
ANSI C 规范定义了 stof()、atoi()、atol()、strtod()、strtol()、strtoul() 共6个可以将字符串转换为数字的函数，大家可以对比学习。另外在 C99 / C++11 规范中又新增了5个函数，分别是 atoll()、strtof()、strtold()、strtoll()、strtoull()
#             ===== 用sstream比較好 =====
:::
:::warning
## [cin 輸入錯誤遇到死循環](https://blog.csdn.net/Fdog_/article/details/107476550)
[cin.xx()在编译器下有不兼容情况](    https://codeantenna.com/a/xHXDWXHssh
)
* 一般情况下推荐使用getchar()手动清空缓存
```cpp=
    if (cin.fail()) {
			
			//让错误标识改回为0,让我们可以继续输入
			cin.clear(); 

			// 有些編譯器不兼容
			//cin.sync();
			
			//会导致输入几个错误值就循环几次
			//cin.ignore();
			
			//推荐手动
			cin.get();
		}

```
:::success

:::
:::warning
## [sort](https://shengyu7697.github.io/std-sort/)
* 引入標頭檔 algorithm
* 排序vector 能用函數過載 或 lambda 函式[uva11729](https://)
:::
:::warning
# [include <thread>](https://shengyu7697.github.io/std-thread/) 
* [Program & Process & Thread](https://medium.com/erens-tech-book/%E7%90%86%E8%A7%A3-process-thread-94a40721b492)
* [注意！在多執行緒程式中常常會互相存取某段程式碼、某個函式、某個變數，需要對這些程式碼進行上鎖，以確保同一時間只有某一個執行緒能進行存取。](https://shengyu7697.github.io/std-mutex/)
* 在 main 主執行緒建立 t1 執行緒後，主執行緒便繼續往下執行，
如果主執行緒需要等 t1 執行完畢後才能繼續執行的話就需要使用 join，
* 如果主執行緒不想等或是可以不用等待 t1 執行緒的話，
就可以使用 detach 來讓 t1 執行緒分離，接著主執行緒就可以繼續執行，t1執行緒也在繼續執行
* 在整個程式結束前最好養成好習慣確保所有子執行緒都已執行完畢
:::
:::warning
## [cin、cin.get()、cin.getline()、getline()](https://blog.csdn.net/qq_40563761/article/details/106113123)
* cin.get():因为get不忽略分隔符，容易影響輸入
* cin.getline():cin.getline(接受字符串的字符串地址,接受个数,结束字符) ，当第三个参数省略时，系统默认为’\0’
* getline():string用的
    
    
:::
:::warning
## [memset()](https://www.itread01.com/hkhkphkpq.html)
* #include <cstring>
* memset是按位元組進行賦值
    memset(a,1,sizeof(a)); // 這時候你去列印a的每一位，值都是16843009，而非你期望的1
    原因：int為四個位元組，這時候每個位元組被memset置為1，而每一個元素都是一個int，即 01 01 01 01，讀取十六進位制為 0x01010101，十進位制為 16843009

不過 char型別的可以使用memset隨意賦值為自己想要的，因為 char只佔一個位元組，賦多少就是多少。
:::


:::warning
## [array, vector, deque; queue, stack](https://zhuanlan.zhihu.com/p/381045908)

:::




