網(wǎng)站死鏈怎么刪除seo管理系統(tǒng)
本節(jié)目標
一、C++關(guān)鍵字(C++98)
二、命名空間
三、C++的輸入輸出
四、缺省函數(shù)
五、函數(shù)重載
六、引用
七、內(nèi)聯(lián)函數(shù)
八、auto關(guān)鍵字(C++11)
九、范圍for(C++11)
十、指針空值nullptr(C++11)
一.C++關(guān)鍵字(C++98)
- C++總計63個關(guān)鍵字,C語言32個關(guān)鍵字
二、命名空間
1.命名空間的定義
- 在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的
- 這些變量、函數(shù)和類的名稱將都存 在于全局作用域中,可能會導(dǎo)致很多沖突
- 使用命名空間的目的是對標識符的名稱進行本地化, 以避免命名沖突或名字污染
- namespace關(guān)鍵字的出現(xiàn)就是針對這種問題的
- 命名空間要用到namepsace關(guān)鍵字 后面跟命名空間的名字
- 每個命名空間都是一個新的作用域
- 一個命名空間就定義了一個新的作用域,里面所有內(nèi)容都局限于該空間內(nèi)
2.命名空間的使用
- 三種使用方法
- 1.命名空間名稱加作用域限定符::
- 2.使用using將命名空間中的某個成員引入
- 3.使用using namespace 命名空間名稱 引入
三、C++的輸入輸出
- 使用cout標準輸出對象(控制臺)和cin標準輸入對象(鍵盤)時,必須包含頭文件<iostream>以及按命名空間使用方法使用std
- cout和cin是全局的流對象,endl是特殊的C++符號,表示換行輸出,他們都包含在<iostream>頭文件中
- <<是流插入運算符 >>是流提取運算符
- 使用C++的輸入輸出比C語言更加方便,不需要手動控制格式,C++的輸入輸出可以自動識別變量類型
- 實際上cout和cin分別是ostream和istream類型的對象 << >> 也涉及到一些重載的知識,后續(xù)我們才會學(xué)到
- 早期的標準庫所有功能都在全局域內(nèi),聲明在.h的頭文件中,后來將其實現(xiàn)在std命名空間內(nèi),為了和C語言區(qū)分,規(guī)定了C++頭文件不用帶.h,舊的編譯器vc6.0還支持.h的,后續(xù)編譯器已不再支持 所以推薦<iostream> + std的方式
四、缺省函數(shù)
1.缺省函數(shù)的概念
- 缺省函數(shù)是在聲明或者定義函數(shù)時為函數(shù)的參數(shù)指定一個缺省值
- 在調(diào)用該函數(shù)時,如果沒有指定實參,則采用缺省值
2.缺省函數(shù)的分類
- 全缺省函數(shù)
- 半缺省函數(shù)
- 注意:半缺省函數(shù)必須從右到左依次給,不能間隔
- 注意:缺省函數(shù)不能在函數(shù)聲明和定義中同時出現(xiàn),否則編譯器不知道用哪個
- 注意:缺省值必須時常量或者全局變量
五、函數(shù)重載
1.函數(shù)重載的概念
- 函數(shù)重載是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數(shù)
- 這些同名函數(shù)的形參列表(參數(shù)個數(shù),類型,或者順序不同)
2.為什么支持函數(shù)重載
- C++為什么支持函數(shù)重載呢,而C語言卻不支持?
- 從程序運行的角度看,C或C++的一個程序要跑起來,需要經(jīng)歷以下階段
- 預(yù)處理,編譯,匯編,鏈接
- 實際項目是由多個頭文件和多個源文件構(gòu)成的,當一個cpp文件中調(diào)用了一個函數(shù)
- 而此函數(shù)定義在另一個cpp文件里,此時調(diào)用函數(shù)的cpp文件里沒有函數(shù)的地址
- 此時怎么辦呢?這時候就用到了鏈接,鏈接看到了調(diào)用另一個cpp文件的函數(shù)
- 然后鏈接就會到另一個cpp文件里去找函數(shù)地址,找到鏈接在一起
- 那么鏈接時,對于這個函數(shù),例如上面的sum函數(shù),編譯器會使用哪個名字去找它呢?
- 這里每個編譯器都有自己的函數(shù)名修飾規(guī)則,windows下修飾規(guī)則過于復(fù)雜,我們這里使用linux里的修飾規(guī)則來演示
?
- ?看完上面,大家應(yīng)該理解了為什么C語言不支持重載,因為同名函數(shù)沒辦法區(qū)分
- 而C++是通過函數(shù)名修飾規(guī)則來區(qū)分函數(shù)的
- 只有參數(shù)不同,修飾出來的名字就不同,就支持了重載
- 注意:如果兩個函數(shù) 名字跟參數(shù) 都一樣, 僅僅返回值不同,是不構(gòu)成重載的,編譯器無法區(qū)分
六、引用
1.引用的概念
- 引用就是取外號,不是定義一個新變量,而是給已存在的變量取一個新名字
- 編譯器不會為此引用開辟新空間,它和引用的變量共用一塊內(nèi)存空間
- 使用方法如下
- 注意:引用類型必須和引用實體是同一種類型的
2.引用的特性
- 1.引用在定義時必須初始化
- 2.一個變量可以有多個引用
- 引用一旦引用一個實體,再不能引用其他實體
3.常引用
- 如果引用的是個常量的話,需要加const
4.使用場景
- 1.做函數(shù)參數(shù),跟指針作用類似,修改此變量可改變此變量值
- 2.做返回值
- 在一般的傳值返回下,都會產(chǎn)生一個返回值的臨時變量再返回
- 用引用的情況下,返回的就是此變量,不會建造一個臨時變量,增加了效率
- 但是有幾點注意事項:
- 如果函數(shù)返回時,出了作用域,返回對象還在,則可以使用引用返回,如果已經(jīng)釋放還給系統(tǒng),則必須使用傳值返回
5.傳引用返回,傳值返回效率比較
6.引用和指針的區(qū)別
- 在語法上,引用僅僅是個別名,沒有獨立空間,和其引用對象共用同一塊內(nèi)存空間
- 但是在底層實現(xiàn)上實際占有空間,因為引用底層是用指針來實現(xiàn)的
- 區(qū)別:
- 1.引用定義變量新別名,指針存儲一個變量地址
- 2.引用定義時必須初始化,指針不需要
- 3.引用在引用一個實體后,無法再引用其他實體,指針可以切換指向
- 4.沒有NULL引用,但有NULL指針
- 5.在sizeof中含義不同,引用結(jié)果為引用類型的大小,指針則只是指針變量的大小,例如4個字節(jié)
- 6.引用自加++,引用對象+1,指針自加++,指針向后偏移一個類型大小
- 7.有多級指針,但是沒有多級引用
- 8.訪問實體方式不同,指針需要顯式解引用,引用則是編譯器自己處理
- 9.引用比指針用起來相對更安全
七、內(nèi)聯(lián)函數(shù)
1.內(nèi)聯(lián)函數(shù)的概念
- 一個函數(shù)前面用inline修飾,則叫做內(nèi)聯(lián)函數(shù)
- 內(nèi)聯(lián)函數(shù)跟宏類似,內(nèi)聯(lián)函數(shù)在編譯期間,會被展開,沒有了調(diào)用函數(shù)棧幀的開銷,提升了程序運行的效率
- 下面兩張區(qū)別圖, call的意思是跳轉(zhuǎn)
2.內(nèi)聯(lián)函數(shù)的特性
- inline內(nèi)聯(lián)函數(shù)是一種以空間換時間的方法
- 缺陷是 目標文件可能變大 優(yōu)點是 少了函數(shù)調(diào)用開銷,提高了程序運行效率
- inline對于編譯器只是一個建議,一般建議將函數(shù)里面代碼量少的進行inline,如果調(diào)用頻繁且遞歸的還是建議不用inline
- inline不建議聲明和定義分離,否則會導(dǎo)致鏈接失敗,因為inline函數(shù)被展開,就沒有函數(shù)地址了,鏈接就會找不到
3.相關(guān)面試題
- 宏的優(yōu)缺點?
- 優(yōu)點 1.增強了代碼的復(fù)用性 2.提高性能
- 缺點 1.不方便調(diào)試宏(預(yù)編譯替換了)2.導(dǎo)致代碼可讀性差,可維護性差,容易誤用 3.沒有類型安全的檢查
- C++有哪些技術(shù)可以替代宏?
- 1.常量定義const enum
- 2.短小函數(shù)定義 如inline內(nèi)聯(lián)函數(shù)
八、auto關(guān)鍵字(C++11)
- 有一些特別長的類型名,如后面要學(xué)的STL迭代器,太長寫起來耗時且容易寫錯、
- 如果用typedef給類型起別名的話,不是特別好,有些情況下例如加了const就不行了
- 此時就產(chǎn)生了auto關(guān)鍵字 auto可以理解成一種變量類型,寫在變量前面
- 可以自動的推斷變量類型
- typeid是獲取變量類型的庫函數(shù)
- auto使用注意:定義變量時必須初始化,否則無法推導(dǎo),編譯器在編譯器會將其auto轉(zhuǎn)變?yōu)槠渥兞繉嶋H類型
- auto使用注意:auto不能用作形參,不能用來聲明數(shù)組
九、范圍for(C++11)
1.范圍for語法
- 在C++98要想遍歷數(shù)組得這樣
- 而范圍for可以簡化遍歷操作
- 這樣就可以了
2.范圍for使用條件
十、指針空值(nullptr)(C++11)
- 以前喜歡給野指針賦予NULL
- 但其實NULL其實是個宏
- 在C++11里面用nullptr替代了NULL
- 為了代碼的健壯性,建議使用nullptr