技能培訓(xùn)四教學(xué)課件_第1頁(yè)
技能培訓(xùn)四教學(xué)課件_第2頁(yè)
技能培訓(xùn)四教學(xué)課件_第3頁(yè)
技能培訓(xùn)四教學(xué)課件_第4頁(yè)
技能培訓(xùn)四教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

技能培訓(xùn)四技能培訓(xùn)四技能培訓(xùn)四主講人:曹宣俊C++面向?qū)ο蟪绦蛟O(shè)計(jì)2021/3/17目錄靜態(tài)成員類成員指針this指針子對(duì)象堆對(duì)象常對(duì)象函數(shù)模板類模板2021/3/17示例程序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/7/22靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)是類的靜態(tài)成員,而不是對(duì)象成員。定義方式是在普通成員函數(shù)前加static調(diào)用靜態(tài)成員函數(shù)時(shí)既可以通過對(duì)象來調(diào)用,也可以通過類來調(diào)用。在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中,不能直接引用類中說明的非靜態(tài)成員,但是可以引用類中說明的靜態(tài)數(shù)據(jù)成員。如果靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時(shí),則可通過對(duì)象來調(diào)用。2023/7/22示例程序classSampl{ private: intn;staticintm;public: Sample(inti){ n=i; m+=i;}Staticvoiddisp(Samplec){ cout<<“n=”<<c.n<<“,m=”<<m<<endl;}};2023/7/22示例程序intSample::m=2;voidmain(){ SampleA(2),B(4); A.disp(B);//通過對(duì)象A調(diào)用靜態(tài)成員函數(shù) Sample::disp(A);//通過類調(diào)用靜態(tài)成員函數(shù)}該程序的執(zhí)行結(jié)果如下:n=4,m=8n=2,m=82023/7/22類成員指針類成員指針包括類數(shù)據(jù)成員指針和類成員函數(shù)指針類數(shù)據(jù)成員指針一般定義格式如下:類型類名::數(shù)據(jù)成員指針名由于類不是運(yùn)行時(shí)存在的對(duì)象,因此,使用類數(shù)據(jù)成員指針時(shí),需要首先指定類的一個(gè)數(shù)據(jù)成員,然后通過類的對(duì)象來引用指針?biāo)赶虻某蓡T。2023/7/22示例程序(類數(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;//等價(jià)于a.m=10}2023/7/22類成員函數(shù)指針指向類成員函數(shù)的指針定義格式如下:類型(類名::*成員函數(shù)指針名)(參數(shù)表)給類成員函數(shù)指針賦值的格式如下:指向成員函數(shù)的指針名=函數(shù)名程序中使用指向函數(shù)的指針調(diào)用函數(shù)的格式如下:(*指向函數(shù)的指針名)(實(shí)參表)2023/7/22示例程序classSampl{ private: intn,m;public: voidsetm(inti){n=i;}voidsetn(inti){n=i;}voiddisp(){ cout<<“n=”<<n<<“,m=”<<m<<endl;}};voidmain(){ void(Sample::*pfub)(int); Samplea; pfun=Sample::setm; (a.*pfun)(10); //等價(jià)于a.setm(10);}2023/7/22this指針在設(shè)計(jì)好一個(gè)類后,通過定義類對(duì)象來調(diào)用類的成員函數(shù),其使用格式為: 對(duì)象.成員函數(shù)在C++中,每個(gè)當(dāng)前對(duì)象都隱含一個(gè)指向該對(duì)象的指針,即this指針。顯然,this指針的類型就是成員函數(shù)所屬的類的類型

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論