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