版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、主講人:曹宣俊C+C+面向?qū)ο蟪绦蛎嫦驅(qū)ο蟪绦蛟O(shè)計設(shè)計第1頁/共41頁2021-12-5目錄 靜態(tài)成員 類成員指針 this指針 子對象 堆對象 常對象 函數(shù)模板 類模板第2頁/共41頁類靜態(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ù)成員的值對每個對象都是一樣的,但是它的值是可以更新的。第3頁/共41頁靜態(tài)數(shù)據(jù)成員定義方法 1,在一般數(shù)據(jù)成員前加關(guān)鍵字static 2,靜態(tài)數(shù)據(jù)成員初始化與一般數(shù)據(jù)成員初始化不同。其初始化如下
2、:數(shù)據(jù)類型 類名:靜態(tài)數(shù)據(jù)成員名= 值;這說明:初始化在類體外進行,而前面不加static,以免與一般靜態(tài)變量或?qū)ο笙嗷煜?。初始化時不加該成員的訪問權(quán)限控制符private,public等初始化時使用作用域來表明它所屬的類靜態(tài)成員必須進行初始化。引用靜態(tài)數(shù)據(jù)成員時,既可以通過對象引用,也可以采用如下格式:類名:靜態(tài)數(shù)據(jù)成員名第4頁/共41頁示例程序class A static int a; ; void main() coutsizeof(A)endl; class Aint a; ; void main() coutsizeof(A)endl; 前者執(zhí)行結(jié)果是1,后者是4.從而可見靜態(tài)數(shù)據(jù)成
3、員節(jié)省內(nèi)存空間第5頁/共41頁靜態(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)用。第6頁/共41頁示例程序 class Samplprivate: int n; static int m;public:Sample(int i)n=i;m+=i; Static void disp(Sample c)cout“n=”c.n“,m=”me
4、ndl;;第7頁/共41頁示例程序 int Sample:m= 2;void main()Sample A(2),B(4);A.disp(B);/通過對象A調(diào)用靜態(tài)成員函數(shù)Sample:disp(A);/通過類調(diào)用靜態(tài)成員函數(shù)該程序的執(zhí)行結(jié)果如下:n=4,m=8n=2,m=8第8頁/共41頁類成員指針 類成員指針包括類數(shù)據(jù)成員指針和類成員函數(shù)指針類數(shù)據(jù)成員指針一般定義格式如下:類型 類名:數(shù)據(jù)成員指針名由于類不是運行時存在的對象,因此,使用類數(shù)據(jù)成員指針時,需要首先指定類的一個數(shù)據(jù)成員,然后通過類的對象來引用指針所指向的成員。第9頁/共41頁示例程序(類數(shù)據(jù)成員指針)class Samplep
5、ublic:void disp()cout“m=”mendl;cout“n=”nendl;int m,n;/公有數(shù)據(jù)成員;void main()int Sample:*p = &Sample:m;Sample a;a.*p=10;/等價于a.m=10 第10頁/共41頁類成員函數(shù)指針 指向類成員函數(shù)的指針定義格式如下:類型(類名:*成員函數(shù)指針名)(參數(shù)表)給類成員函數(shù)指針賦值的格式如下:指向成員函數(shù)的指針名=函數(shù)名程序中使用指向函數(shù)的指針調(diào)用函數(shù)的格式如下:(*指向函數(shù)的指針名)(實參表)第11頁/共41頁示例程序 class Samplprivate: int n,m;public
6、:void setm(int i)n=i; void setn(int i) n=i; void disp()cout“n=”n“,m=”mendl;;void main()void (Sample:*pfub)(int);Sample a;pfun=Sample:setm;(a.*pfun)(10); /等價于a.setm(10);第12頁/共41頁this指針 在設(shè)計好一個類后,通過定義類對象來調(diào)用類的成員函數(shù),其使用格式為:對象.成員函數(shù)在C+中,每個當(dāng)前對象都隱含一個指向該對象的指針,即this指針。顯然,this指針的類型就是成員函數(shù)所屬的類的類型第13頁/共41頁示例程序class
7、 Samplprivate: int n;public:Sample(int m) n=m;void addvalue(int m)Sample s;s.n=n+m;*this = s;void disp()cout“n=”nn =s1.n+s2.n;return (*this); 第16頁/共41頁this指針 Attention: 靜態(tài)成員函數(shù)沒有this指針。因為類只有一個靜態(tài)成員函數(shù)實例,所以使用this指針沒有什么意義。在靜態(tài)成員函數(shù)中使用this指針會引起編譯錯誤,不然靜態(tài)成員函數(shù)就會像非靜態(tài)成員函數(shù)一樣使用指針進行訪問了。第17頁/共41頁子對象 當(dāng)一個類的數(shù)據(jù)成員是另一個類的對
8、象時,這個對象就稱為子對象。子對象可以像通過對象那樣使用,唯一要考慮的是: 子對象構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行次序。一般的,設(shè)類A含有子對象obj,該子對象對應(yīng)的 類是B,如:class B;class AB obj;/obj是類B的對象,是類A的子對象。; 為了調(diào)用子對象obj的構(gòu)造函數(shù),設(shè)計類A的構(gòu)造函數(shù)如下:A(參數(shù)表):obj(參數(shù)表2)函數(shù)體;第18頁/共41頁說明 當(dāng)建立obj調(diào)用類B的不帶參數(shù)的構(gòu)造函數(shù)時,可省略obj() 當(dāng)類A中有多個字對象時,在A構(gòu)造函數(shù)”:“后列出各子對象的初始化表達式,它們之間用逗號分隔,稱為子對象初始化列表。 A構(gòu)造函數(shù)的執(zhí)行 次序是,以子對象在類A中說明
9、的順序調(diào)用子對象初始化列表中列出的各構(gòu)造函數(shù),然后執(zhí)行函數(shù)體。第19頁/共41頁示例程序class Bint b;public:B()b=1;void printb()coutb=bendl;class Aint a;B c;public:A(int i) a=i;void printa()couta=aendl;c.printb();void main()A a(2);a.printa();第20頁/共41頁說明 該程序中,類A有一個子對象c,它是類B的對象。由于建立c子對象調(diào)用類B的不帶參數(shù)的構(gòu)造函數(shù),所以類A構(gòu)造函數(shù)沒有給出c().對于A a(2)語句,執(zhí)行類A的構(gòu)造函數(shù),其過程是:先調(diào)
10、用B類構(gòu)造函數(shù),給賦值1,再執(zhí)行a=2.本程序執(zhí)行結(jié)構(gòu)是 a =2 b =1第21頁/共41頁析構(gòu)函數(shù) 在含有子對象的類A中,設(shè)計析構(gòu)函數(shù)如下: A()函數(shù)體; 其執(zhí)行次序是:先執(zhí)行函數(shù)體,再以子對象在類A中說明的相反次序調(diào)用各類的析構(gòu)函數(shù)第22頁/共41頁示例程序class B1public:B1()coutB1:Constructorendl;B1()coutB1:Descontructorendl;class B2public:B2()coutB2:Constructorendl;B2()coutB2:Descontructorendl;class B3public:B3()coutB3
11、:Constructorendl;B3()coutB3:Descontructorendl;class A B1 b1;B2 b2;B3 b3;public:A():b3(),b2(),b1()coutAendl;A()coutA:Descontructorendl;void main()A a;第23頁/共41頁程序分析 程序中定義了四個類,類A中含有3個子對象b1,b2,b3, 分別是類B1,B2,B3的對象,其說明次序是b1,b2,b3, 按照子對象構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行次序得到以下的程序運行結(jié)果 B1:Constructor B2:Constructor B3:Constructor
12、 A:Constructor A:Destructor B1:Destructor B2:Destructor B3:Destructor第24頁/共41頁堆對象 所謂堆對象是指在程序運行過程中根據(jù)需要隨時建立或刪除的對象。這種堆對象被創(chuàng)建在內(nèi)存一些空閑的存儲單元中,這些存儲單元稱為堆。它們可以被創(chuàng)建的堆對象占有,也可以通過刪除堆對象而獲得釋放。 創(chuàng)建或刪除堆對象時,需要如下兩個運算符:new 或delete這兩個運算符又稱為動態(tài)分配內(nèi)存空間運算符。new相當(dāng)于C語言的malloc()函數(shù),delete相當(dāng)于C語言的free()函數(shù)第25頁/共41頁運算符new的用法 運算符new的用法 該運
13、算符的功能是用來創(chuàng)建堆對象,或者說,它是用來動態(tài)地創(chuàng)建對象。new運算符使用格式如下: new 類型說明符(初始化列表) 它說明在堆中建立一個由類型說明符給定的類型的對象時,并且由括號中的初始值列表 給出被創(chuàng)建對象的初始值.如果省去括號和括號中的初始值,則被創(chuàng)建的對象選用默認值. 使用new運算符創(chuàng)建對象時,可以根據(jù)其參數(shù)來選擇適當(dāng)?shù)臉?gòu)造函數(shù),不需要sizeof來計算對象所占用的 字節(jié)數(shù),便可以計算其大小. new運算符返回一個指針,指針類型將與new所分配對象相匹配,如果不匹配要通過強制類型轉(zhuǎn)換,否則將出現(xiàn)編譯錯誤. 如果new運算符不能分配到所需要的內(nèi)存,它將返回0,這時的指針為空指針.
14、new運算符也可以來創(chuàng)建數(shù)組類型的對象,即對象數(shù)組,其格式如下: new 類名算術(shù)表達式第26頁/共41頁 其中,算術(shù)表達式的值為所創(chuàng)建的對象數(shù)組的大小.例如: A* ptr; ptr = new A5; 其中,A是一個已知的類名,ptr指向類A對象的一個指針.通過new A5創(chuàng)建一個對象數(shù)組,該數(shù)組有5個元素.它的返回值賦給指針ptr,于是 ptr便指向?qū)ο髷?shù)組的指針. 使用new創(chuàng)建對象數(shù)組或一般數(shù)組時,不能為該數(shù)組指定初始值,其初始值為默認值. 注意: (1)用new創(chuàng)建對象時,要調(diào)用構(gòu)造函數(shù). (2)使用new來創(chuàng)建對象數(shù)組時,類中必須說明默認默認構(gòu)造函數(shù) (3)使用new創(chuàng)建類sam
15、ple的對象數(shù)組Samplen時,系統(tǒng)調(diào)用默認構(gòu)造函數(shù)n次.第27頁/共41頁運算符delete的用法該運算符的功能是用來刪除使用new創(chuàng)建的對象或一般類型的指針.其格式如下: delete 例如: A* ptr; ptr=new A(5,6);delete ptr; 其中,ptr是一個指向類A的指針,使用new給ptr分配了內(nèi)存空間,又使用了delete刪除了指針ptr. 運算符delete也可以用來刪除使用new創(chuàng)建的對象數(shù)組,其使用格式如下: delete 指針名例如: A* ptr; ptr = new A5; delete ptr; 其中,ptr指向類A對象的指針.它被賦值為指向一個
16、具有5個元素的類A的對象數(shù)組的首元素.使用delete刪除了這個數(shù)組.第28頁/共41頁運算符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ù)多少次.第29頁/共41頁常類型 常類型是指用類型修飾符const修飾說明的類型,常類型的變量或?qū)ο蟮闹凳遣荒芨碌?所
17、以能夠達到 既保證數(shù)據(jù)共享,又防止改變數(shù)據(jù)的目的. 常對象 常對象是指對象常量,定義格式如下: 類名 const 對象名 或者 const 類名 對象名 在定義常對象時必須進行初始化,而且該對象不能再被更新.第30頁/共41頁常類型 例如,有以下程序: class Sample int n; public:Sample(int i)n=i;void setvalue(int i)n=i;void display()coutn=endl; ; void main() const Sample a(10);a.setvalue(6);a.display(); 第31頁/共41頁常類型 本程序中有兩
18、個錯誤,第一個錯誤是a.setvalue(6);語句,錯誤信息是error C2662:setvalue:cannot convert this pointer from const class Sample to class Sample&,即常對象不能被更新(setvalue成員函數(shù)修改數(shù)據(jù)成員). 第二個錯誤是a.display()語句,錯誤信息是error C2662:display:cannot convert this pointer from const class Sample to class Sample &,該錯誤也是由于常對象a不能被更新,盡管disla
19、y() 沒有修改常對象a. 第32頁/共41頁常對象成員 常成員函數(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ū)分。例如類中有如下說明:Void print()Void print ()const第33頁/共41頁示例程序
20、class Sample int n; public:Sample(int i)n=i;void print()cout1:n=nendl;void print()const cout2:n=nendl; ; void main() Sample a(10);const Sample b(20);a.print();b.print();第34頁/共41頁程序說明 本程序的執(zhí)行結(jié)果是1:n=10 2:n=20 本程序中Sample類中說明了兩個同名函數(shù)print,其中一個是常函數(shù),在主函數(shù)中 說明了兩個對象a和b,其中對象b是常對象,通過對象a調(diào)用的是沒有const修飾的 函數(shù),而通過對象b調(diào)用的是用const修飾的常函數(shù)第35頁/共4
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度采光井玻璃更換與維護合同3篇
- 二零二五年度氣象站氣象數(shù)據(jù)安全保障合同3篇
- 2024蘇州租賃合同含寵物飼養(yǎng)及養(yǎng)護服務(wù)條款3篇
- 2024版民間借貸合同范例
- 2025年度茶樓裝修工程消防設(shè)施合同范本4篇
- 2025年度10kv配電站施工期間質(zhì)量檢測與驗收合同正規(guī)范本3篇
- 2025年度教育機構(gòu)LOGO知識產(chǎn)權(quán)許可合同范本3篇
- 2025年度智能物流系統(tǒng)全國代理銷售合同4篇
- 2025年度廠房施工合同施工人員培訓(xùn)協(xié)議(新版)3篇
- 2025年度智能工廠改造裝修合同模板3篇
- 小學(xué)四年級數(shù)學(xué)知識點總結(jié)(必備8篇)
- GB/T 893-2017孔用彈性擋圈
- GB/T 11072-1989銻化銦多晶、單晶及切割片
- GB 15831-2006鋼管腳手架扣件
- 醫(yī)學(xué)會自律規(guī)范
- 商務(wù)溝通第二版第4章書面溝通
- 950項機電安裝施工工藝標準合集(含管線套管、支吊架、風(fēng)口安裝)
- 微生物學(xué)與免疫學(xué)-11免疫分子課件
- 《動物遺傳育種學(xué)》動物醫(yī)學(xué)全套教學(xué)課件
- 弱電工程自檢報告
- 民法案例分析教程(第五版)完整版課件全套ppt教學(xué)教程最全電子教案
評論
0/150
提交評論