C++技能培訓(xùn)四課件_第1頁
C++技能培訓(xùn)四課件_第2頁
C++技能培訓(xùn)四課件_第3頁
C++技能培訓(xùn)四課件_第4頁
C++技能培訓(xùn)四課件_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++面向?qū)ο蟪绦蛟O(shè)計2023/3/10目錄靜態(tài)成員類成員指針this指針子對象堆對象常對象函數(shù)模板類模板2023/3/10類靜態(tài)成員靜態(tài)成員分為:靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)靜態(tài)數(shù)據(jù)成員 靜態(tài)數(shù)據(jù)成員是類的所有對象共享的成員,而不是某個對象的成員。使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存,因為它是所有對象所共有的,只需存儲一處,供所有對象共用。靜態(tài)數(shù)據(jù)成員的值對每個對象都是一樣的,但是它的值是可以更新的。2023/3/10示例程序classA{ staticinta;};voidmain(){ cout<<sizeof(A)<<endl; }classA{ inta;};voidmain(){ cout<<sizeof(A)<<endl; }前者執(zhí)行結(jié)果是1,后者是4.從而可見靜態(tài)數(shù)據(jù)成員節(jié)省內(nèi)存空間2023/3/10靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)是類的靜態(tài)成員,而不是對象成員。定義方式是在普通成員函數(shù)前加static調(diào)用靜態(tài)成員函數(shù)時既可以通過對象來調(diào)用,也可以通過類來調(diào)用。在靜態(tài)成員函數(shù)的實現(xiàn)中,不能直接引用類中說明的非靜態(tài)成員,但是可以引用類中說明的靜態(tài)數(shù)據(jù)成員。如果靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時,則可通過對象來調(diào)用。2023/3/10示例程序classSampl{ private: intn;staticintm;public: Sample(inti){ n=i; m+=i;}Staticvoiddisp(Samplec){ cout<<“n=”<<c.n<<“,m=”<<m<<endl;}};2023/3/10類成員指針類成員指針包括類數(shù)據(jù)成員指針和類成員函數(shù)指針類數(shù)據(jù)成員指針一般定義格式如下:類型類名::數(shù)據(jù)成員指針名由于類不是運行時存在的對象,因此,使用類數(shù)據(jù)成員指針時,需要首先指定類的一個數(shù)據(jù)成員,然后通過類的對象來引用指針所指向的成員。2023/3/10示例程序(類數(shù)據(jù)成員指針)classSample{public: voiddisp(){ cout<<“m=”<<m<<endl; cout<<“n=”<<n<<endl;}intm,n;//公有數(shù)據(jù)成員};voidmain(){ intSample::*p=&Sample::m; Samplea; a.*p=10;//等價于a.m=10}2023/3/10類成員函數(shù)指針指向類成員函數(shù)的指針定義格式如下:類型(類名::*成員函數(shù)指針名)(參數(shù)表)給類成員函數(shù)指針賦值的格式如下:指向成員函數(shù)的指針名=函數(shù)名程序中使用指向函數(shù)的指針調(diào)用函數(shù)的格式如下:(*指向函數(shù)的指針名)(實參表)2023/3/10this指針在設(shè)計好一個類后,通過定義類對象來調(diào)用類的成員函數(shù),其使用格式為: 對象.成員函數(shù)在C++中,每個當前對象都隱含一個指向該對象的指針,即this指針。顯然,this指針的類型就是成員函數(shù)所屬的類的類型

2023/3/10示例程序classSampl{ private: intn;public:Sample(intm){n=m;}voidaddvalue(intm){ Samples; s.n=n+m; *this=s;}voiddisp(){ cout<<“n=”<<n<<endl;}};voidmain(){ Samples(10); s.disp(); s.addvalue(5); s.disp(); }2023/3/10示例程序進行說明本程序執(zhí)行的結(jié)果是n=10,n=15上述程序中,Sample類中定義了一個addvalue非靜態(tài)成員函數(shù),語句s.addvalue(5);通過對象s來調(diào)用addvalue()成員函數(shù),其中隱含一個指向?qū)ο髎的指針,該語句告訴系統(tǒng)是將s對象的私有數(shù)據(jù)成員n增大5,而不是其他對象。它實際上相當于以下函數(shù)調(diào)用:addvalue(&s,5);即將類對象的地址作為第一個參數(shù)傳遞給了函數(shù)。addvalue函數(shù)的原型實際是:voidaddvlue(Sample*this,intm)。該函數(shù)的第一個參數(shù)指向該類對象的一個指針,即this指針。我們定義該成員函數(shù)時,并沒有看到這樣一個參數(shù),因為這個參數(shù)是系統(tǒng)隱含的。在成員函數(shù)的定義體中,可以通過this訪問這一參數(shù)。2023/3/10this指針Attention:靜態(tài)成員函數(shù)沒有this指針。因為類只有一個靜態(tài)成員函數(shù)實例,所以使用this指針沒有什么意義。在靜態(tài)成員函數(shù)中使用this指針會引起編譯錯誤,不然靜態(tài)成員函數(shù)就會像非靜態(tài)成員函數(shù)一樣使用指針進行訪問了。2023/3/10子對象當一個類的數(shù)據(jù)成員是另一個類的對象時,這個對象就稱為子對象。子對象可以像通過對象那樣使用,唯一要考慮的是:子對象構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行次序。一般的,設(shè)類A含有子對象obj,該子對象對應(yīng)的類是B,如:classB{};classA{Bobj;//obj是類B的對象,是類A的子對象。。。};為了調(diào)用子對象obj的構(gòu)造函數(shù),設(shè)計類A的構(gòu)造函數(shù)如下:A(參數(shù)表):obj(參數(shù)表2){函數(shù)體;}2023/3/10說明當建立obj調(diào)用類B的不帶參數(shù)的構(gòu)造函數(shù)時,可省略obj()當類A中有多個字對象時,在A構(gòu)造函數(shù)”:“后列出各子對象的初始化表達式,它們之間用逗號分隔,稱為子對象初始化列表。A構(gòu)造函數(shù)的執(zhí)行次序是,以子對象在類A中說明的順序調(diào)用子對象初始化列表中列出的各構(gòu)造函數(shù),然后執(zhí)行函數(shù)體。2023/3/10說明該程序中,類A有一個子對象c,它是類B的對象。由于建立c子對象調(diào)用類B的不帶參數(shù)的構(gòu)造函數(shù),所以類A構(gòu)造函數(shù)沒有給出c().對于Aa(2)語句,執(zhí)行類A的構(gòu)造函數(shù),其過程是:先調(diào)用B類構(gòu)造函數(shù),給c.b賦值1,再執(zhí)行a=2.本程序執(zhí)行結(jié)構(gòu)是a=2b=12023/3/10析構(gòu)函數(shù)在含有子對象的類A中,設(shè)計析構(gòu)函數(shù)如下:~A(){函數(shù)體;};其執(zhí)行次序是:先執(zhí)行函數(shù)體,再以子對象在類A中說明的相反次序調(diào)用各類的析構(gòu)函數(shù)2023/3/10示例程序classB1{public: B1(){cout<<"B1:Constructor"<<endl;} ~B1(){cout<<"B1:Descontructor"<<endl;}};classB2{public: B2(){cout<<"B2:Constructor"<<endl;} ~B2(){cout<<"B2:Descontructor"<<endl;}};classB3{public: B3(){cout<<"B3:Constructor"<<endl;} ~B3(){cout<<"B3:Descontructor"<<endl;}};classA{ B1b1; B2b2; B3b3;public: A():b3(),b2(),b1(){cout<<"A"<<endl;} ~A(){cout<<"A:Descontructor"<<endl;}};voidmain(){ Aa;}2023/3/10堆對象所謂堆對象是指在程序運行過程中根據(jù)需要隨時建立或刪除的對象。這種堆對象被創(chuàng)建在內(nèi)存一些空閑的存儲單元中,這些存儲單元稱為堆。它們可以被創(chuàng)建的堆對象占有,也可以通過刪除堆對象而獲得釋放。創(chuàng)建或刪除堆對象時,需要如下兩個運算符:new或delete這兩個運算符又稱為動態(tài)分配內(nèi)存空間運算符。new相當于C語言的malloc()函數(shù),delete相當于C語言的free()函數(shù)2023/3/10運算符new的用法運算符new的用法該運算符的功能是用來創(chuàng)建堆對象,或者說,它是用來動態(tài)地創(chuàng)建對象。new運算符使用格式如下:new類型說明符(初始化列表)它說明在堆中建立一個由"類型說明符"給定的類型的對象時,并且由括號中的"初始值列表"給出被創(chuàng)建對象的初始值.如果省去括號和括號中的初始值,則被創(chuàng)建的對象選用默認值.使用new運算符創(chuàng)建對象時,可以根據(jù)其參數(shù)來選擇適當?shù)臉?gòu)造函數(shù),不需要sizeof來計算對象所占用的字節(jié)數(shù),便可以計算其大小.new運算符返回一個指針,指針類型將與new所分配對象相匹配,如果不匹配要通過強制類型轉(zhuǎn)換,否則將出現(xiàn)編譯錯誤.如果new運算符不能分配到所需要的內(nèi)存,它將返回0,這時的指針為空指針.new運算符也可以來創(chuàng)建數(shù)組類型的對象,即對象數(shù)組,其格式如下:new類名[算術(shù)表達式]2023/3/10運算符delete的用法注意:(1)運算符delete必須使用于由運算符new返回的指針.(2)該運算符也適用于空指針(即其值為0的指針)(3)對一個指針只能使用一次delete操作(4)指針名前只用一對括號符,并且不管所刪除數(shù)組的維數(shù),忽略方括號內(nèi)的任何數(shù)字.(5)用delete刪除對象時,要調(diào)用析構(gòu)函數(shù)(6)使用delete刪除對象數(shù)組時,該數(shù)組由多少元素,就調(diào)用析構(gòu)函數(shù)多少次.2023/3/10常類型常類型是指用類型修飾符const修飾說明的類型,常類型的變量或?qū)ο蟮闹凳遣荒芨碌?所以能夠達到既保證數(shù)據(jù)共享,又防止改變數(shù)據(jù)的目的.常對象常對象是指對象常量,定義格式如下:類名const對象名或者const類名對象名在定義常對象時必須進行初始化,而且該對象不能再被更新.2023/3/10常類型例如,有以下程序:classSample{ intn;public: Sample(inti){n=i;} voidsetvalue(inti){n=i;} voiddisplay(){cout<<"n="<<endl;}};voidmain(){ constSamplea(10); a.setvalue(6); a.display();}2023/3/10常類型本程序中有兩個錯誤,第一個錯誤是a.setvalue(6);語句,錯誤信息是"errorC2662:'setvalue':cannotconvert'this'pointerfrom'constclassSample'to'classSample&'",即常對象不能被更新(setvalue成員函數(shù)修改數(shù)據(jù)成員).第二個錯誤是a.display()語句,錯誤信息是"errorC2662:'display':cannotconvert'this'pointerfrom'constclassSample'to'classSample&'",該錯誤也是由于常對象a不能被更新,盡管dislay()沒有修改常對象a.

2023/3/10常對象成員常成員函數(shù)使用const關(guān)鍵字說明的函數(shù)稱為常成員函數(shù),常成員函數(shù)的說明格式如下:數(shù)據(jù)類型函數(shù)名(參數(shù)表)const注意:(1)const是函數(shù)類型的一個組成部分,因此在實現(xiàn)部分也要帶const關(guān)鍵字。(2)常成員函數(shù)不更新對象的數(shù)據(jù)成員,也不能調(diào)用該類沒有用const修飾的成員函數(shù)。(3)如果將一個對象說明為常對象,則通過該常對象只能調(diào)用它的常成員函數(shù),而不能調(diào)用其他成員函數(shù)。(4)const可以被用于參與對重載函數(shù)的區(qū)分。例如類中有如下說明:Voidprint()Voidprint()const2023/3/10示例程序classSample{ intn;public: Sample(inti){n=i;} voidprint(){cout<<"1:n="<<n<<endl;} voidprint()const{cout<<"2:n="<<n<<endl;}};voidmain(){ Samplea(10); constSampleb(20); a.print(); b.print();}2023/3/10程序說明本程序的執(zhí)行結(jié)果是1:n=102:n=20本程序中Sample類中說明了兩個同名函數(shù)print,其中一個是常函數(shù),在主函數(shù)中說明了兩個對象a和b,其中對象b是常對象,通過對象a調(diào)用的是沒有const修飾的函數(shù),而通過對象b調(diào)用的是用const修飾的常函數(shù)2023/3/10常數(shù)據(jù)成員就像一般數(shù)據(jù)一樣,類中的成員數(shù)據(jù)也可以是常量和常引用,使用const說明的數(shù)據(jù)成員為常數(shù)據(jù)成員。如果在一個類中說明了常數(shù)據(jù)成員,那么構(gòu)造函數(shù)只能通過初始化列表對該數(shù)據(jù)成員進行初始化。2023/3/10舉例classSample{ consti

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論