命名空間:
在C/C++中,變量、函數和後面要學到的類都是大量存在的,這些變量、函數和類的名稱將都存在於全局作用 域中,可能會導
致很多衝突。使用命名空間的目的是對標識符的名稱進行本地化,以避免命名衝突或名字污染。
命名空間的定義:需要使用到namespace關鍵字,後面跟命名空間的名字,然後接一對{}即可
缺省參數:(全缺省和半缺省)
缺省參數是聲明或定義函數時爲函數的參數指定一個默認值。在調用該函數時,如果沒有指定實參則採用該默 認值,否則使
用指定的實參。
注意:
1. 半缺省參數必須從右往左依次來給出,不能間隔着給
2. 缺省參數不能在函數聲明和定義中同時出現
3. 缺省值必須是常量或者全局變量
4. C語言不支持(編譯器不支持)
函數重載 :是函數的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數,這些同名函數的形 參列表(參數個
數 或 類型 或 順序)必須不同,常用來處理實現功能類似數據類型不同的問題,因爲函數在底層的命名修飾規則不同,所以c++
支持函數重載,c語言不支持 ,但是可以在c++中以c語言的風格來編譯程序,這時只要加上extern "C"就可以了。
函數的編譯過程需要經歷以下幾步:
1,預處理 //宏替換,頭文件展開,條件編譯,去掉註釋
2,編譯 //檢查語法,生成彙編代碼
3,彙編 //把彙編代碼轉換成機器代碼
4,鏈接 //生成可執行程序
名字修飾:是一種在編譯過程中,將函數、變量的名稱重新改編的機制,簡單來說就是編譯器爲了區分各 個函數,將函數通過
某種算法,重新修飾爲一個全局唯一的名稱。
引用:
引用不是新定義一個變量,而是給已存在變量取了一個別名,編譯器不會爲引用變量開闢內存空間,它和它引 用的變量共用
同一塊內存空間
引用特性 :
1. 引用在定義時必須初始化
2. 一個變量可以有多個引用
3. 引用一旦引用一個實體,再不能引用其他實體
引用的使用場景:
1,做參數:
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
2,做返回值:引用做返回值時需要注意:
如果函數返回時,離開函數作用域後,其棧上空間已經還給系統,因此不能用棧上的空間作爲引用類型 返回。如果以引用類型
返回,返回值的生命週期必須不受函數的限制(即比函數生命週期長)。
int& TestRefReturn(int& a)
{
a += 10;
return a;
}
引用和指針的區別:
1. 引用在定義時必須初始化,指針沒有要求
2. 引用在初始化時引用一個實體後,就不能再引用其他實體,而指針可以在任何時候指向任何一個同類型實 體
3. 沒有NULL引用,但有NULL指針
4. 在sizeof中含義不同:引用結果爲引用類型的大小,但指針始終是地址空間所佔字節個數(32位平臺下佔4 個字節)
5. 引用自加即引用的實體增加1,指針自加即指針向後偏移一個類型的大小
6. 有多級指針,但是沒有多級引用
7. 訪問實體方式不同,指針需要顯式解引用,引用編譯器自己處理
8. 引用比指針使用起來相對更安全
內聯函數:
以inline修飾的函數叫做內聯函數,編譯時C++編譯器會在調用內聯函數的地方展開,沒有函數壓棧的開銷, 內聯函數提
升程序運行的效率,
特性:
1. inline是一種以空間換時間的做法,省去調用函數額開銷。所以代碼很長或者有循環/遞歸的函數不適宜使 用作爲內聯函數。
2. inline對於編譯器而言只是一個建議,編譯器會自動優化,如果定義爲inline的函數體內有循環/遞歸等 等,編譯器優化時會忽
略掉內聯。
3. inline不建議聲明和定義分離,分離會導致鏈接錯誤。因爲inline被展開,就沒有函數地址了,鏈接就會找 不到
宏的優缺點:
優點:1.增強代碼的複用性。 2.提高性能。
缺點:1.不方便調試宏。(因爲預編譯階段進行了替換) 2.導致代碼可讀性差,可維護性差,容易誤用。3.沒有類型安全的檢查
c++一般使用什麼替換宏:1. 常量定義 換用const修飾,或者枚舉 2. 函數定義 換用內聯函數
auto關鍵字:
使用auto修飾的變量,是具有自動存儲器的局部變量,可以自動推導變量類型。
注意:
使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導auto的實際類 型。因此auto並非是
一種“類型”的聲明,而是一個類型聲明時的“佔位符”,編譯器在編譯期會將auto替換爲變 量實際的類型。
auto的使用:
1. auto與指針和引用結合起來使用,用auto聲明指針類型時,用auto和auto*沒有任何區別,但用auto聲明引用類型時則必須加&
2. 在同一行定義多個變量,當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因爲編譯器實際
只對第一個 類型進行推導,然後用推導出來的類型定義其他變量。
auto不能使用的場景:
1. auto不能作爲函數的參數
2. auto不能直接用來聲明數組
3. auto在實際中常見的優勢用法就是和範圍for循環,還有lambda表達式等進 行配合使用。
4. auto不能定義類的非靜態成員變量
6. 實例化模板時不能使用auto作爲模板參數
範圍for循環:
對於一個有範圍的集合而言,由程序員來說明循環的範圍是多餘的,有時候還會容易犯錯誤。因此C++11中引 入了基於範圍的
for循環。for循環後的括號由冒號“ :”分爲兩部分:第一部分是範圍內用於迭代的變量,第二 部分則表示被迭代的範圍。
範圍for循環的使用條件:
1. for循環迭代的範圍必須是確定的 對於數組而言,就是數組中第一個元素和後一個元素的範圍;對於類而言,應該提供begin
和end的方法, begin和end就是for循環迭代的範圍
2. 迭代的對象要實現++和==的操作。