thread_local 存儲(chǔ)類
- 使用 thread_local 說(shuō)明符聲明的變量?jī)H可在它在其創(chuàng)建的線程上訪問(wèn)
- 變量在創(chuàng)建線程時(shí)創(chuàng)建,并在銷(xiāo)毀線程時(shí)銷(xiāo)毀
- thread_local 說(shuō)明符可以與 static 或 extern 合并
- 每個(gè)線程都有其自己的變量副本
位運(yùn)算符
- ^ : binary加
- << : 向左移動(dòng)指定的位數(shù)
雜項(xiàng)運(yùn)算符
- sizeof : 返回變量的大小
- , : 順序執(zhí)行一系列運(yùn)算。整個(gè)逗號(hào)表達(dá)式的值是以逗號(hào)分隔的列表中的最后一個(gè)表達(dá)式的值
- Cast : 強(qiáng)制轉(zhuǎn)換運(yùn)算符把一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。例如,int(2.2000) 將返回 2
C++ 函數(shù)
- 每個(gè) C++ 程序都至少有一個(gè)函數(shù),即主函數(shù) main()
- 可以把代碼劃分到不同的函數(shù)中
- 函數(shù)聲明告訴編譯器函數(shù)的名稱、返回類型和參數(shù)
- C++ 標(biāo)準(zhǔn)庫(kù)提供了大量的程序可以調(diào)用的內(nèi)置函數(shù)。例如,函數(shù) strcat() 用來(lái)連接兩個(gè)字符串,函數(shù) memcpy() 用來(lái)復(fù)制內(nèi)存到另一個(gè)位置
- 函數(shù)還有很多叫法,比如方法、子例程或程序
- 向參數(shù)傳遞一個(gè)值,這個(gè)值被稱為實(shí)際參數(shù)
- 函數(shù)聲明會(huì)告訴編譯器函數(shù)名稱及如何調(diào)用函數(shù)
- 在函數(shù)聲明中,參數(shù)的名稱并不重要,只有參數(shù)的類型是必需的
- 在一個(gè)源文件中定義函數(shù)且在另一個(gè)文件中調(diào)用函數(shù)時(shí),函數(shù)聲明是必需的。在這種情況下,您應(yīng)該在調(diào)用函數(shù)的文件頂部聲明函數(shù)
函數(shù)參數(shù)
- 如果函數(shù)要使用參數(shù),則必須聲明接受參數(shù)值的變量。這些變量稱為函數(shù)的形式參數(shù)
- 形式參數(shù)就像函數(shù)內(nèi)的其他局部變量,在進(jìn)入函數(shù)時(shí)被創(chuàng)建,退出函數(shù)時(shí)被銷(xiāo)毀
三種向函數(shù)傳遞參數(shù)的方式:
- 傳值調(diào)用 : 該方法把參數(shù)的實(shí)際值賦值給函數(shù)的形式參數(shù)。在這種情況下,修改函數(shù)內(nèi)的形式參數(shù)對(duì)實(shí)際參數(shù)沒(méi)有影響
- 指針調(diào)用 : 該方法把參數(shù)的地址賦值給形式參數(shù)。在函數(shù)內(nèi),該地址用于訪問(wèn)調(diào)用中要用到的實(shí)際參數(shù)。這意味著,修改形式參數(shù)會(huì)影響實(shí)際參數(shù)
- 引用調(diào)用 : 該方法把參數(shù)的引用賦值給形式參數(shù)。在函數(shù)內(nèi),該引用用于訪問(wèn)調(diào)用中要用到的實(shí)際參數(shù)。這意味著,修改形式參數(shù)會(huì)影響實(shí)際參數(shù)
- 默認(rèn)情況下,C++ 使用傳值調(diào)用來(lái)傳遞參數(shù)
參數(shù)的默認(rèn)值
- 可以為參數(shù)列表中后邊的每一個(gè)參數(shù)指定默認(rèn)值
- 如果實(shí)際參數(shù)的值留空,則使用這個(gè)默認(rèn)值
- 在函數(shù)定義中使用賦值運(yùn)算符來(lái)為參數(shù)賦值
Lambda 函數(shù)與表達(dá)式
- C++11 提供了對(duì)匿名函數(shù)的支持
- Lambda 表達(dá)式把函數(shù)看作對(duì)象,比如可以將它們賦給變量和作為參數(shù)傳遞,還可以像函數(shù)一樣對(duì)其求值
[capture](parameters)->return-type{body}[](int x, int y){ return x < y ; }- 在Lambda表達(dá)式內(nèi)可以訪問(wèn)當(dāng)前作用域的變量,這是Lambda表達(dá)式的閉包(Closure)行為
- 與JavaScript閉包不同,C++變量傳遞有傳值和傳引用的區(qū)別,可以通過(guò)前面的[]來(lái)指定
- [] // 沒(méi)有定義任何變量。使用未定義變量會(huì)引發(fā)錯(cuò)誤
- [x, &y] // x以傳值方式傳入(默認(rèn)),y以引用方式傳入
- [&] // 任何被使用到的外部變量都隱式地以引用方式加以引用
- [=] // 任何被使用到的外部變量都隱式地以傳值方式加以引用
- [&, x] // x顯式地以傳值方式加以引用。其余變量以引用方式加以引用
- [=, &z] // z顯式地以引用方式加以引用。其余變量以傳值方式加以引用
- 對(duì)于[=]或[&]的形式,lambda 表達(dá)式可以直接使用 this 指針。但是,對(duì)于[]的形式,如果要使用 this 指針,必須顯式傳入
C++ 數(shù)學(xué)運(yùn)算
- 需要引用數(shù)學(xué)頭文件 <cmath>
- hypot(double, double); 返回兩個(gè)參數(shù)的平方總和的平方根
- rand(),該函數(shù)只返回一個(gè)偽隨機(jī)數(shù)
- 生成隨機(jī)數(shù)之前必須先調(diào)用 srand() 函數(shù)
// 設(shè)置種子
srand( (unsigned)time( NULL ) );
cout<<rand();
C++ 數(shù)組
- 所有的數(shù)組都是由連續(xù)的內(nèi)存位置組成
- 最低的地址對(duì)應(yīng)第一個(gè)元素,最高的地址對(duì)應(yīng)最后一個(gè)元素
- 省略掉了數(shù)組的大小,數(shù)組的大小則為初始化時(shí)元素的個(gè)數(shù)
- C++ setw() 函數(shù)用于設(shè)置字段的寬度, n 表示寬度
- 當(dāng)后面緊跟著的輸出字段長(zhǎng)度小于 n 的時(shí)候,在該字段前面用空格補(bǔ)齊,當(dāng)輸出字段長(zhǎng)度大于 n 時(shí),全部整體輸出
- 可以 setfill() 配合使用設(shè)置其他字符填充
多維數(shù)組
type name[size1][size2]...[sizeN];- 內(nèi)部嵌套的括號(hào)是可選的
- C++ 不允許返回一個(gè)完整的數(shù)組作為函數(shù)的參數(shù)。但是,您可以通過(guò)指定不帶索引的數(shù)組名來(lái)返回一個(gè)指向數(shù)組的指針
- C++ 不支持在函數(shù)外返回局部變量的地址,除非定義局部變量為 static 變量
int * getRandom( )
{
static int r[10];
// 設(shè)置種子
srand( (unsigned)time( NULL ) );
for (int i = 0; i < 10; ++i)
{
r[i] = rand();
cout << r[i] << endl;
}
return r;
}
- C++ 中您可以通過(guò)指定不帶索引的數(shù)組名來(lái)傳遞一個(gè)指向數(shù)組的指針
- C++ 傳數(shù)組給一個(gè)函數(shù),數(shù)組類型自動(dòng)轉(zhuǎn)換為指針類型,因而傳的實(shí)際是地址
- C++ 不會(huì)對(duì)形式參數(shù)執(zhí)行邊界檢查
- 數(shù)組名是指向數(shù)組中第一個(gè)元素的常量指針
在函數(shù)中傳遞一個(gè)一維數(shù)組作為參數(shù),您必須以下面三種方式來(lái)聲明函數(shù)形式參數(shù):
- 形式參數(shù)是一個(gè)指針
myFunction(int *param) - 形式參數(shù)是一個(gè)已定義大小的數(shù)組
myFunction(int param[10]) - 形式參數(shù)是一個(gè)未定義大小的數(shù)組
myFunction(int param[])
字符串
- C 風(fēng)格的字符串
- 字符串實(shí)際上是使用 null 字符 '\0' 終止的一維字符數(shù)組
- 不需要把 null 字符放在字符串常量的末尾,C++ 編譯器會(huì)在初始化數(shù)組時(shí),自動(dòng)把 '\0' 放在字符串的末尾
- strcpy,strcat,strlen,strcmp,strchr,strstr