第4課:C++函數(shù)與類_第1頁
第4課:C++函數(shù)與類_第2頁
第4課:C++函數(shù)與類_第3頁
第4課:C++函數(shù)與類_第4頁
第4課:C++函數(shù)與類_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、靈訓(xùn)教育靈訓(xùn)教育C+C+語言基礎(chǔ)語言基礎(chǔ)第第4 4課:課:C+C+函數(shù)與類函數(shù)與類2021-11-42第第5 5章、函數(shù)章、函數(shù)5.1 5.1 函數(shù)的定義與使用函數(shù)的定義與使用5.2 5.2 函數(shù)重載函數(shù)重載5.3 5.3 函數(shù)指針函數(shù)指針第第6 6章、類章、類6.1 6.1 成員與訪問控制成員與訪問控制6.2 6.2 拷貝構(gòu)造、賦值,類型轉(zhuǎn)換拷貝構(gòu)造、賦值,類型轉(zhuǎn)換6.3 6.3 右值引用,移動構(gòu)造、賦值右值引用,移動構(gòu)造、賦值6.4 6.4 嵌套類、局部類嵌套類、局部類6.5 6.5 類型別名、友元類型別名、友元6.6 6.6 繼承、多重繼承繼承、多重繼承6.7 6.7 多態(tài)多態(tài)6.8 6

2、.8 限定符限定符2021-11-43 熟悉熟悉C+C+函數(shù)和類的概念(函數(shù)和類的概念(函數(shù)函數(shù),重載重載,函數(shù)指針函數(shù)指針,類類,繼承繼承,構(gòu)造函數(shù)構(gòu)造函數(shù),析構(gòu)函數(shù)析構(gòu)函數(shù),虛函數(shù)虛函數(shù),純虛函數(shù)純虛函數(shù),右值引用右值引用,抽象基類抽象基類,接口接口,覆蓋覆蓋,隱藏隱藏,多重繼承多重繼承,虛基類虛基類)。)。掌握掌握C+C+的語法關(guān)鍵字:的語法關(guān)鍵字:protectedprotected、privateprivate、typedeftypedef、friendfriend、staticstatic、constconst、constexprconstexpr、mutablemutable、v

3、olatilevolatile、explicitexplicit、noexceptnoexcept、virtualvirtual、overrideoverride、finalfinal、thread_localthread_local、 virtual、override、final。2021-11-44 5 5.1 .1 函數(shù)的定義與使用函數(shù)的定義與使用5 5. .2 2 函數(shù)重載函數(shù)重載5 5. .3 3 函數(shù)指針函數(shù)指針接第接第1.51.5節(jié),本章將詳細(xì)講解函數(shù)的相關(guān)語法概念節(jié),本章將詳細(xì)講解函數(shù)的相關(guān)語法概念。 2021-11-455 5. .1 1.1 .1 全局函數(shù)全局函數(shù)5.1.2

4、 5.1.2 形參、實參、返回值形參、實參、返回值5.1.3 5.1.3 成員函數(shù)成員函數(shù)5.1.4 5.1.4 局部函數(shù)(局部函數(shù)(lambdalambda)2021-11-46 在程序結(jié)構(gòu)中,全局函數(shù)需要首先定義(或聲明),然后在具體的實現(xiàn)文件中實現(xiàn)代碼,之后才可以在其他代碼中調(diào)用。全局函數(shù)在調(diào)用時,可以使用命名空間加界定運算符符的方式引用,或直接用界定運算符引用,防止與同名的成員函數(shù)混淆。一個函數(shù)可以被另外一個函數(shù)調(diào)用,當(dāng)函數(shù)直接或間接調(diào)用到自己時,也稱為遞歸調(diào)用,要特別注意遞歸調(diào)用產(chǎn)生的死循環(huán),會導(dǎo)致棧溢出。函數(shù)的實現(xiàn)代碼只能是一份,可以在多處聲明,多次調(diào)用,調(diào)用前必須首先聲明,如果函

5、數(shù)的實現(xiàn)部分在函數(shù)的調(diào)用部分之前,則函數(shù)的聲明可省略。函數(shù)在聲明時,可以添加extern關(guān)鍵字限定。函數(shù)在實現(xiàn)時,如果添加static關(guān)鍵字限定,表示該函數(shù)是靜態(tài)全局函數(shù)(內(nèi)部函數(shù)),只能在該實現(xiàn)文件內(nèi)部使用,不能被聲明調(diào)用。不建議濫用全局函數(shù)。2021-11-47 函數(shù)在定義(或聲明)、實現(xiàn)部分定義的參數(shù)是形參,在調(diào)用的部分帶入的參數(shù)是實參;實參與形參要一一對應(yīng);可以從右向左為形參定義默認(rèn)值,在實參調(diào)用時,有默認(rèn)值的形參可以不指定實參。一般形參的改變不會影響到實參,不過可以將形參定義為引用類型,這樣在函數(shù)體內(nèi)改變形參的值,可以最終影響實參。函數(shù)實參的求值順序是從右向左。一個函數(shù)可以有且只能有

6、一個返回值,該返回值必須通過return關(guān)鍵字返回,且必須與函數(shù)定義的返回值類型一致,返回值可以參與表達(dá)式運算;如果函數(shù)沒有返回值,可以將返回值類型定義為void型,函數(shù)仍然可以使用return返回。建議一個函數(shù)自有一個出口,對于有返回值的函數(shù),用一個return語句,對于無返回值的函數(shù),無return語句。2021-11-48定義在類中的函數(shù)被稱為成員函數(shù)。成員函數(shù)不能被外部聲明引用,只能被定義一次,實現(xiàn)一次,可被調(diào)用多次。成員函數(shù)在定義時,可以直接編寫代碼(不建議),也可以分離到外部,在實現(xiàn)文件中編寫代碼;如果函數(shù)在外部編寫代碼,需要加上類名的界定。在成員函數(shù)內(nèi)部可以使用類的數(shù)據(jù)成員;在成

7、員函數(shù)內(nèi)部還隱含一個形參this,表示該類的實例對象指針。成員函數(shù)在被調(diào)用時,需要使用一個實例化的類對象變量加成員引用運算符,該變量的指針被作為this的實參傳遞給成員函數(shù),成員函數(shù)操作的所有數(shù)據(jù)成員全通過this指針獲取。(考慮下,用空指針引用成員函數(shù)的情況)成員函數(shù)在類中定義時,如果加上static關(guān)鍵字,被稱為靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)類似全局函數(shù),不隱含this指針,不得使用數(shù)據(jù)成員,可以使用靜態(tài)數(shù)據(jù)成員,使用時需要用類加界定運算符。2021-11-49C+沒有子函數(shù)的概念,不過C+11標(biāo)準(zhǔn)中,增加了lambda表達(dá)式的語法概念??梢栽谝粋€函數(shù)內(nèi)部定義一個局部函數(shù),定義形式如下:捕獲列

8、表(形參列表)-返回值類型函數(shù)體代碼;捕獲列表:獲取上級函數(shù)的局部變量。使用&表示以引用的方式獲取,使用=表示以值的方式獲??;也可以具體指定上級函數(shù)的局部變量名。形參列表、返回值類型、函數(shù)體:與正常函數(shù)定義形式一樣。lambda表達(dá)式需要賦值給一個變量(函數(shù)對象),才可以正常使用。2021-11-410不使用循環(huán),僅使用函數(shù),實現(xiàn)從1加到100。2021-11-4115 5. .2 2.1 .1 函數(shù)重載定義函數(shù)重載定義5.2.2 5.2.2 實參匹配實參匹配2021-11-412在相同作用域中的函數(shù),如果名稱相同,形參不同,則稱為函數(shù)重載。形參不同指形參的類型或數(shù)量不同。運算符重載可

9、以看作是一種函數(shù)重載。2021-11-413函數(shù)重載在使用時,C+編譯器會根據(jù)實參與形參的類型匹配程度最接近的函數(shù)。如果兩個函數(shù)匹配程度一樣,則會產(chǎn)生二義性的編譯錯誤。2021-11-4145 5. .3 3.1 .1 函數(shù)指針的定義函數(shù)指針的定義5.3.2 5.3.2 函數(shù)重載的指針函數(shù)重載的指針5.3.3 5.3.3 運算符重載的指針運算符重載的指針2021-11-415函數(shù)指針的定義形式類似于函數(shù)聲明,將函數(shù)名替換為指針。函數(shù)指針是個指針類型的變量,用取地址運算符獲取函數(shù)的地址;調(diào)用時,與普通函數(shù)的調(diào)用方式相同。函數(shù)指針只針對全局函數(shù)和靜態(tài)成員函數(shù)。注意,由于函數(shù)調(diào)用運算符的優(yōu)先級較高,

10、解地址運算符與函數(shù)指針需要用括號括起來。2021-11-416函數(shù)重載在獲取函數(shù)指針時,也使用最匹配原則,有時也可以使用強制類型轉(zhuǎn)換。2021-11-417運算符重載與函數(shù)有相同的特性,也可以賦值給一個函數(shù)指針變量。2021-11-418 6 6.1 .1 成員與訪問控制成員與訪問控制6 6. .2 2 拷貝構(gòu)造、賦值,類型轉(zhuǎn)換拷貝構(gòu)造、賦值,類型轉(zhuǎn)換 6 6. .3 3 右值引用,移動構(gòu)造、賦值右值引用,移動構(gòu)造、賦值 6 6. .4 4 嵌套類、局部類嵌套類、局部類 6 6. .5 5 類型別名、友元類型別名、友元 6 6. .6 6 繼承、多重繼承繼承、多重繼承 6 6. .7 7 多態(tài)

11、多態(tài) 6 6. .8 8 限定符限定符接第接第1.31.3節(jié),本章詳細(xì)講解類的語法概念節(jié),本章詳細(xì)講解類的語法概念。 2021-11-4196 6. .1 1.1 .1 構(gòu)造、析構(gòu)函數(shù)構(gòu)造、析構(gòu)函數(shù)6.1.2 6.1.2 數(shù)據(jù)成員、成員函數(shù)數(shù)據(jù)成員、成員函數(shù)6.1.3 6.1.3 訪問控制訪問控制6.1.4 6.1.4 成員指針成員指針2021-11-420每個類都會有構(gòu)造函數(shù)和析構(gòu)函數(shù),如果用戶未定義,C+編譯器會自動生成默認(rèn)的無參數(shù)的構(gòu)造、析構(gòu)函數(shù)。用戶可以定義自己的構(gòu)造、析構(gòu)函數(shù),構(gòu)造函數(shù)可以帶參數(shù),析構(gòu)函數(shù)不能有參數(shù)。如果自定義的無參數(shù)的構(gòu)造、析構(gòu)函數(shù),希望保留與默認(rèn)相同的功能,可以使

12、用default關(guān)鍵字,如果希望刪除默認(rèn)的構(gòu)造、析構(gòu)函數(shù),可以使用delete關(guān)鍵字。類的成員變量,可以在構(gòu)造函數(shù)的初始化列表中賦初值,賦值的順序與定義的順序相同。類實例對象在創(chuàng)建的時候,構(gòu)造函數(shù)被調(diào)用,銷毀的時候,析構(gòu)函數(shù)被調(diào)用。2021-11-421不用循環(huán)語句,不使用遞歸,從1打印到100。2021-11-422類中的函數(shù)成員被稱為成員函數(shù),包括普通成員函數(shù)和靜態(tài)成員函數(shù)。類中的數(shù)據(jù)成員,包括成員變量、成員常量、成員引用、靜態(tài)成員變量等;數(shù)據(jù)成員可在定義時,直接賦初值,也可以在構(gòu)造函數(shù)的初始化列表里賦初值。靜態(tài)成員變量需要在實現(xiàn)文件中賦初值。成員引用只能在構(gòu)造函數(shù)的初始化列表中賦初值。2

13、021-11-423C+的類成員,有三種訪問控制類型:私有private、保護protected、公有public。private:私有,只能被本類中的成員函數(shù)訪問。protected:保護,只能被本類及子類中的成員函數(shù)訪問。public:可被所有的函數(shù)訪問。2021-11-424嚴(yán)格上說,成員指針并不真正屬于指針,只不過是在類中的偏移量。定義方式相對于真正的指針,需要在指針前加上類界定。成員指針定義好并賦值后,可以使用類實例對象變量加上成員指針運算符引用。2021-11-4256 6. .2 2.1 .1 拷貝構(gòu)造拷貝構(gòu)造6.2.2 6.2.2 拷貝賦值拷貝賦值6.2.3 6.2.3 類型轉(zhuǎn)

14、換類型轉(zhuǎn)換2021-11-426拷貝構(gòu)造函數(shù)的形參類型是本身類的引用,用于使用一個已有的類對象實例克隆出一個的類對象實例。如果未定義拷貝構(gòu)造,C+編譯器會自動生成一個默認(rèn)的拷貝構(gòu)造,可以使用delete關(guān)鍵字刪除。2021-11-427拷貝賦值就是類中重載了賦值運算符,用于將一個類對象實例的數(shù)據(jù)賦值給另一個類對象實例。如果未定義拷貝賦值,C+編譯器會自動生成一個默認(rèn)的拷貝賦值,可以使用delete關(guān)鍵字刪除。2021-11-428帶一個形參的構(gòu)造函數(shù),用于在表達(dá)式中將形參的類型轉(zhuǎn)換為類本身的類型。2021-11-4296 6. .3 3.1 .1 右值引用右值引用6.3.2 6.3.2 移動構(gòu)

15、造移動構(gòu)造6.3.3 6.3.3 移動賦值移動賦值2021-11-430接第4.5節(jié),能被賦值的操作數(shù)被稱為左值,左值代表一個持久存在的對象,可以取地址,可以引用;不能被賦值的操作數(shù)被稱為右值,常數(shù)、常量、臨時變量等都是右值,不能取右值的地址,舊的標(biāo)準(zhǔn)也不能引用右值。為了在數(shù)據(jù)傳遞過程中,減少拷貝的次數(shù),保證更好的性能,C+11制定了右值引用類型,可以看做是一個復(fù)合數(shù)據(jù)類型,由“&”定義,用于引用一個右值。使用標(biāo)準(zhǔn)庫中的std:move函數(shù)可以將左值引用轉(zhuǎn)化為右值引用。相對的,使用一個“&”定義的引用,可稱為左值引用;左值引用只能引用左值。2021-11-431 右值引用多用于

16、函數(shù)的參數(shù)傳遞,與左值引用一樣,減少對象的拷貝次數(shù),提高了性能;與左值引用不同的是,右值引用可以引用右值。右值引用的另一個常用場景,用于把即將銷毀的對象中的資源直接移動給接收的變量,就是下一節(jié)要討論的移動構(gòu)造和移動賦值。2021-11-432只有一個形參,并且形參類型為類本身的右值引用的構(gòu)造函數(shù),稱為移動構(gòu)造。用于直接將右值引用中資源移動給自己,而不是拷貝資源。使用移動構(gòu)造時,要特別注意,原對象的資源已被轉(zhuǎn)移,原對象將不再做資源清理工作。2021-11-433與移動構(gòu)造類似,只有一個形參,并且形參類型為類本身的右值引用的賦值運算符重載,稱為移動賦值。用于直接將右值引用中資源移動給自己,而不是拷

17、貝資源。2021-11-4346 6. .4 4.1 .1 嵌套類嵌套類6.4.2 6.4.2 局部類局部類 2021-11-435C+允許在類內(nèi)部定義子類,稱為嵌套類。相當(dāng)于命名空間的嵌套。嵌套類與上層的包裹類之間除了嵌套關(guān)系外,并沒有其他任何關(guān)系,是相對獨立的。嵌套類在訪問時,需要添加上層包裹類的界定。2021-11-436在函數(shù)體內(nèi)也可以定義類,稱為局部類。2021-11-4376 6. .5 5.1 .1 類型別名類型別名6 6. .5 5. .2 2 友元函數(shù)友元函數(shù)6.5.3 6.5.3 友元類友元類 2021-11-438使用typedef關(guān)鍵字,可以將繁瑣的類型名稱定義成一個簡

18、單的別名。2021-11-439使用friend關(guān)鍵字,將一個函數(shù)定義為一個類的友元函數(shù),則該函數(shù)可以訪問類中的任何數(shù)據(jù)成員,包括私有和保護的。2021-11-440使用friend關(guān)鍵字,將一個類定義為另一個類的友元類,則該類中的成員函數(shù)可以訪問另一個類中的任何數(shù)據(jù)成員,包括私有和保護的。2021-11-4416 6. .6 6.1 .1 基類與派生類基類與派生類6 6. .6 6. .2 2 隱藏、覆蓋隱藏、覆蓋6.6.3 6.6.3 基類成員的使用基類成員的使用6.6.4 6.6.4 訪問權(quán)限提升訪問權(quán)限提升6.6.5 6.6.5 多重繼承多重繼承6.6.6 6.6.6 虛繼承虛繼承20

19、21-11-442 基類與派生類都是類,派生類從基類繼承而來,派生類也可以作為另外派生類的基類;派生類將默認(rèn)包含基類成員中除私有成員外的所有成員,實現(xiàn)了功能的復(fù)用。繼承的語法形式:class 派生類名稱 : 繼承訪問控制 基類名稱 類體 ;繼承訪問控制與類成員的訪問控制形式一致,也分為私有、保護、公有三種;用于繼承后降低基類成員的訪問控制權(quán)限;一般用public,表示基類成員的訪問控制不變;特殊場合,如果使用protected,表示基類公有成員變?yōu)楸Wo成員,私有成員訪問控制不變;使用private,表示將基類所有成員變?yōu)樗接谐蓡T。2021-11-443派生類中如果定義了與基類中相同名稱的成員,

20、則基類中的該成員,在派生類中被隱藏。如果要在派生類中使用被隱藏的基類成員,需要加上基類名的界定。針對成員函數(shù),如果基類和派生類中存在形式完全相同的成員函數(shù),則稱派生類的該成員函數(shù)覆蓋基類的對應(yīng)成員函數(shù)(覆蓋主要用于虛函數(shù))??紤]一下,成員函數(shù)的重載、隱藏、覆蓋的區(qū)別。2021-11-444在派生類中(以及在外部使用派生類),基類中的可訪問到的成員,和派生類中的成員一樣,沒有使用上的限制;基類中被隱藏或覆蓋的成員,使用前需加上基類名的界定。反過來,在基類中(以及在外部使用基類),則不能使用派生類中的成員(覆蓋的虛函數(shù)除外)。在派生類的構(gòu)造函數(shù)中的初始化列表中,可以調(diào)用基類的構(gòu)造函數(shù)。2021-1

21、1-445在派生類中,可以使用using關(guān)鍵字,將基類中的保護成員提升為公有成員。2021-11-446C+支持一個派生類從多個基類繼承,稱為多重繼承。多個基類中的成員同時被派生類繼承復(fù)用,當(dāng)多個基類中的成員有重名時,在派生類中使用時,需要加上不同基類的名稱界定。不建議使用多重繼承。2021-11-447在多重繼承中,如果多基類中又存在從共同的上層基類派生,則在最終的派生類中,會存在隔層基類的多份拷貝;如果不希望隔層基類在最終的派生類中有多份拷貝,則需要中間層基類虛繼承上層基類,標(biāo)明該基類為共享基類,在多重繼承的最終派生類中,只保留一份拷貝。虛繼承的定義,需要在繼承訪問控制前(或后)加上vir

22、tual關(guān)鍵字。2021-11-4486 6. .7 7.1 .1 虛函數(shù)、純虛函數(shù)虛函數(shù)、純虛函數(shù)6.7.2 6.7.2 抽象基類、接口抽象基類、接口6.7.3 6.7.3 多態(tài)多態(tài)2021-11-449在基類中,使用virtual關(guān)鍵字限定的函數(shù)為虛函數(shù)。虛函數(shù)可以實現(xiàn)使用基類的指針(或引用)調(diào)用派生類中成員函數(shù)的能力。在基類中未實現(xiàn)的虛函數(shù)被稱為純虛函數(shù),需要在定義時,在虛函數(shù)結(jié)尾加上“= 0”。在派生類中一般要覆蓋虛函數(shù),覆蓋時,可以加上virtual關(guān)鍵字,也可以不加;建議在派生類中覆蓋虛函數(shù)時,在結(jié)尾處加上override關(guān)鍵字限定,明確表示覆蓋基類的虛函數(shù),減少因代碼編輯錯誤,照

23、成的邏輯錯誤。在派生類的覆蓋虛函數(shù)的定義的結(jié)尾加上final關(guān)鍵字限定,則禁止后續(xù)的派生類再覆蓋該虛函數(shù)。類的析構(gòu)函數(shù)可以定義為虛函數(shù),這樣使用delete運算符和基類的指針,就可以銷毀派生類對象。類的構(gòu)造函數(shù)不允許定義為虛函數(shù)。2021-11-450定義有純虛函數(shù)的類,被稱為抽象基類,抽象基類不能實例化對象。類中僅包含純虛函數(shù)的類,稱為接口。2021-11-451同一個基類可以有多個派生類;可以通過基類的指針(或引用),調(diào)用不同派生類中虛成員函數(shù)。當(dāng)同一個基類指針,在不同的場景下,調(diào)用不同派生類中的虛成員函數(shù)的行為,被稱為多態(tài)。2021-11-4526.8.1 6.8.1 靜態(tài)靜態(tài)stati

24、cstatic6.8.2 6.8.2 外部聲明外部聲明externextern6.8.3 6.8.3 常量常量constconst和和constexprconstexpr6.8.4 6.8.4 可變成員可變成員mutablemutable6.8.5 6.8.5 禁止優(yōu)化禁止優(yōu)化volatilevolatile6.8.6 6.8.6 明確類型轉(zhuǎn)換明確類型轉(zhuǎn)換explicitexplicit6.8.7 6.8.7 無異常無異常noexceptnoexcept6.8.8 6.8.8 虛函數(shù)虛函數(shù)virtualvirtual6.8.9 6.8.9 明確覆蓋明確覆蓋overrideoverride6.8.10 6.8.10 禁止覆蓋(或繼承)禁止覆蓋(或繼承)finalfinal6.8.11 6.8.11 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)inlineinline6.8.12 6.8.12 線程變量線程變量thread_localthread_local2021-11-453用于定義靜態(tài)全局函數(shù)、靜態(tài)成員函數(shù)、靜態(tài)成員變量。還可以定義靜態(tài)局部變量,在函數(shù)中使用static關(guān)鍵字定義的變量是靜態(tài)局部變量,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論