《面向?qū)ο蟪绦蛟O(shè)計》實驗指導書(實_第1頁
《面向?qū)ο蟪绦蛟O(shè)計》實驗指導書(實_第2頁
《面向?qū)ο蟪绦蛟O(shè)計》實驗指導書(實_第3頁
《面向?qū)ο蟪绦蛟O(shè)計》實驗指導書(實_第4頁
《面向?qū)ο蟪绦蛟O(shè)計》實驗指導書(實_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗二 類與對象對象初始化、對象數(shù)據(jù)與指針一、實驗?zāi)康?理解構(gòu)造函數(shù)、析構(gòu)函數(shù)的意義及作用,掌握構(gòu)造函數(shù)、析構(gòu)函數(shù)的定義及調(diào)用時間,熟悉構(gòu)造函數(shù)的種類;2理解 this 指針及使用方法,熟悉對象數(shù)組、對象指針、對象引用的定義及使用方法,熟悉對象作為函數(shù)參數(shù)的使用方法;3熟悉類與對象的應(yīng)用及編程。二、實驗學時課內(nèi)實驗: 2 課時課外練習: 2 課時三 本實驗涉及的新知識 構(gòu)造函數(shù)與析構(gòu)函數(shù)在 C+ 中,提供了兩個特殊的成員函數(shù),即構(gòu)造函數(shù)和析構(gòu)函數(shù)。構(gòu)造函數(shù)用于對象的初始化,即在定義一個類對象時,計算機在給對象分配相應(yīng)的存儲單元的同時,為對象的數(shù)據(jù)成員賦初值。析構(gòu)執(zhí)行的是與構(gòu)造函數(shù)相反的操作,用

2、于撤銷對象的同時釋放對象所占用的內(nèi)存空間。1構(gòu)造函數(shù) 構(gòu)造函數(shù)的定義格式:類名(形參表) 構(gòu)造函數(shù)體 構(gòu)造函數(shù)的調(diào)用構(gòu)造函數(shù)的調(diào)用是在定義對象時調(diào)用的。格式:類名對象名(實參表)。類名對象名 =構(gòu)造函數(shù)名(實參表)。 說明 構(gòu)造函數(shù)必須與類同名。 構(gòu)造函數(shù)沒有返回值,但不能在構(gòu)造函數(shù)前加void必須加類型符void )。 在實際應(yīng)用中,在定義類時通常應(yīng)定義一至多個構(gòu)造函數(shù)初始化;如果不給出構(gòu)造函數(shù),系統(tǒng)將自定義一個構(gòu)造函數(shù)。類型符(其他沒有返回值的成員函數(shù)(重載 ),以對各數(shù)據(jù)成員進行 構(gòu)造函數(shù)可以可以帶參數(shù),也可不帶任何參數(shù)(稱無參構(gòu)選函數(shù)),還可以使用缺省參數(shù)。 不能象普通成員函數(shù)一樣單獨

3、調(diào)用。2析構(gòu)函數(shù) 析構(gòu)函數(shù)的定義格式:類名( void ) 析構(gòu)函數(shù)體 析構(gòu)函數(shù)的調(diào)用析構(gòu)函數(shù)是在撤銷對象時自動調(diào)用的。說明 析構(gòu)函數(shù)與構(gòu)造函數(shù)的名字相同,但在其前面加上“,”如果未定義析構(gòu)函數(shù),系統(tǒng)將自定義一個析構(gòu)函數(shù)。 析構(gòu)函數(shù)沒有參數(shù)、沒有返回值,也不能重載。 對于大多數(shù)類而言,可以缺省析構(gòu)函數(shù)的定義,但是,當類的數(shù)據(jù)成員中使用指針變量,在構(gòu)造函數(shù)中用new 動態(tài)分配內(nèi)存空間時,應(yīng)顯式定義析構(gòu)函數(shù),用delete 釋放已分配的內(nèi)存空間。3拷貝構(gòu)造函數(shù)(復制構(gòu)造函數(shù))拷貝構(gòu)造函數(shù)的定義格式:類名( const 類名 & 對象名) 拷貝構(gòu)造函數(shù)體 拷貝構(gòu)造函數(shù)的調(diào)用拷貝構(gòu)造函數(shù)是在對

4、象間相互賦值時自動調(diào)用的。格式:目標對象名=源對象名。目標對象名 (源對象名 )。 說明 拷貝構(gòu)造函數(shù)無返回值,也不能有void 。 如果不定義拷貝構(gòu)造函數(shù),系統(tǒng)會自定義一個拷貝構(gòu)造函數(shù),實現(xiàn)對數(shù)據(jù)成員的拷貝。 默認拷貝構(gòu)造函數(shù)是一種淺拷貝,當在類中定義有指針數(shù)據(jù)成員,用new 分配內(nèi)存空間時,通常應(yīng)顯示定義相應(yīng)的拷貝構(gòu)造函數(shù)。 對象數(shù)組與對象指針1對象數(shù)組 可以定義對象數(shù)組處理多個對象。 可以用缺省參數(shù)構(gòu)造函數(shù)為對象數(shù)組賦初值。2對象指針可以使用指針來使用對象或?qū)ο髷?shù)組。方法: 定義對象指針; 將指針指向某一對象(或?qū)ο髷?shù)組); 用指針使用用對象(或?qū)ο髷?shù)組元素):對象指針->公有成員

5、3對象引用可以定義對象的引用,其引用名即為對象的別名。4this 指針C+ 提供了一個特殊的對象指針,稱為this 指針。this 指針為成員函數(shù)所屬對象的指針,指向?qū)ο蟮氖椎刂?。this 指針是一種隱含指針,隱含于每個類的成員函數(shù)中,即調(diào)用某成員函數(shù)時,都將自動產(chǎn)生一個 this 指針。 調(diào)用 this 指針格式: this->成員名 this 指針通常采用隱式調(diào)用,即在類內(nèi)部直呼其名。this 指針是系統(tǒng)自定義的,用戶不能再定義 對象作為函數(shù)的參數(shù)在 C+ 中,可以用對象作為函數(shù)的形參或?qū)崊ⅰV饕幸韵滦问剑?/101形參、實參均為對象,其參數(shù)的傳遞為對象的值,即為傳值調(diào)用。2形參為

6、對象指針,實參為對象指針或?qū)ο蟮刂?,其參?shù)的傳遞為對象的地址,即傳址調(diào)用。3形參為對象引用,實參為對象,形參是實參對象的別名,即傳址調(diào)用。4形參、實參為對象指針或?qū)ο髷?shù)組,為傳址調(diào)用。四、實驗內(nèi)容 驗證及認知實驗按要求調(diào)試下列程序,并回答相關(guān)問題。程序 1( exp_201.cpp)#include<iostream.h>class Myclasspublic:Myclass (void) cout<<"constructing!"<<endl。 Myclass (void) cout<<"destructing!&

7、quot;<<endl。 。void main() Myclass ob 。 問題: 運行程序的輸出結(jié)果為: 該輸出結(jié)果說明構(gòu)造函數(shù)Myclass ( ) 是在執(zhí)行的,而析構(gòu)函數(shù) Myclass ( ) 是在是在執(zhí)行的。 將 main( )中的“ Myclassob。”改為:“Myclassob2 。”后,運行程序的輸出結(jié)果為: 將 main( ) 中的 “ Myclass ob2 ?!备臑椋骸?Myclass *ob 。 ob=new Myclass2 ?!焙螅\行程序的輸出結(jié)果為: 在的基礎(chǔ)上,在程序的末尾加入:“delete ob ?!焙?,運行程序的輸出結(jié)果為:3/10 比較

8、的輸出結(jié)果,說明:。程序 2( exp_202.cpp)#include<iostream.h>class A private:int a,b 。public:A(void) a=0 。 b=0 。 A(int x1,int x2)a=x1 。 b=x2 。 A(A &ob) a=ob.a 。 b=ob.b。cout<<" 拷貝構(gòu)造函數(shù)被調(diào)用!"<<endl 。void print(void) cout<<"a="<<a<<" b="<<b&l

9、t;<endl。 。void main() A ob1(20,30),ob 。 A ob2(ob1) 。ob2.print() 。/ ob=ob1 。/ ob.print() 。問題: 運行該程序的輸出結(jié)果為: 程序中的成員函數(shù)A(A &ob) 稱為,該函數(shù)的執(zhí)行時間是在執(zhí)行被調(diào)用的。 將 main() 中的“ A ob2(ob1) ?!备臑椤?A ob2=ob1?!保匦逻\行程序,觀察輸出結(jié)果,說明拷貝構(gòu)造函數(shù)也可在時調(diào)用。 將 main() 函數(shù)中加注釋的語句去掉前面的“/”,重新運行程序,觀測輸出結(jié)果,說明執(zhí)行“ ob=ob1 ?!睍r調(diào)用拷貝構(gòu)造函數(shù),原因是“ob=ob1。

10、”只是對象的。4/10 知識應(yīng)用實驗1分析下列程序,寫出程序的輸出結(jié)果,再上機運行程序驗證其正確性,如果不正確,請認真分析出錯原因。程序 3( exp_203.cpp)#include<iostream.h>你分析的程序輸出結(jié)果是:class Myclass private:int a,b 。public:Myclass(int x1=0,int x2=0)a=x1 。 b=x2 。cout<<" 構(gòu)造函數(shù)被調(diào)用!"<<endl 。Myclass()cout<<" 析構(gòu)函數(shù)被調(diào)用!"<<endl

11、 。Myclass(Myclass &ob) a=ob.a 。 b=ob.b。cout<<" 拷貝構(gòu)造函數(shù)被調(diào)用!"<<endl 。void print(void) cout<<"a="<<a<<" b="<<b<<endl。 程序的實際輸出結(jié)果是: 。void func1(Myclass ob) cout<<"func1: " 。ob.print() 。void func2(Myclass *ob) cout&

12、lt;<"func2: " 。ob->print() 。void func3(Myclass &ob) cout<<"func3: " 。ob.print() 。void main() Myclass ob(10,10) 。cout<<"main: " 。 ob.print() 。cout<<" 調(diào)用 func1: "<<endl 。func1(ob) 。cout<<" 調(diào)用 func2: "<<endl

13、 。func2(&ob) 。cout<<" 調(diào)用 func3: "<<endl 。func3(ob) 。5/10cout<<"main: " 。 ob.print() 。2完善、調(diào)試通過下列程序,并按所要求回答問題。程序 4( exp_204.cpp)#include<iostream.h>#include<string.h>class person private:char *name。public:person(char *pn) 。 /構(gòu)造函數(shù)聲明person(void) 。/ 析

14、構(gòu)函數(shù)聲明person(const person &ob) 。 /拷貝構(gòu)造函數(shù)聲明char *get_name(void) return name 。 void print_name(void) 。 。:person(char *pn) / 定義構(gòu)造函數(shù),為name 提供值 name= 。if(name!=NULL)。 :person(void)/ 顯示定義析構(gòu)函數(shù) delete name 。 :person(const person &ob) / 定義拷貝構(gòu)造函數(shù) name= 。if(name!=NULL)。void person:print_name(void)cout&l

15、t;<name<<endl 。 void main(void) person p1(" 張三 ") 。 person p2=p1。cout<<" 姓名 :"。 p1.print_name() 。cout<<" 姓名 :"。 p2.print_name() 。問題: 程序中處應(yīng)為;處應(yīng)為;6/10處應(yīng)為;處應(yīng)為;處應(yīng)為;程序 5( exp_102.cpp)/頭文件“ hscore.h”內(nèi)容:定義一個成績類:最多可以處理10 科成績及平均成績const int M=10 。class score

16、private:float scM,aver 。 /表示 M 科成績的數(shù)組及平均成績int m 。/ 表示實際考試科數(shù)public:score(void) 。/無參構(gòu)造函數(shù)score(float x,int n) 。 /構(gòu)造函數(shù)重載初始化成績void set_score(float x,int n) 。 /提供成績float get_score(int i)/ 得到第 i 科成績return sci 。float get_aver(void)/ 得到平均成績return aver 。 void print_score(void) 。 。score:score(void)/ 無參構(gòu)造函數(shù) int

17、 i 。 m=M 。for(i=0 。 i<m 。i+) sci=0 。aver=0。score:score(float x,int n) / 構(gòu)造函數(shù)重載初始化成績 int i 。 float sum=0 。m=n 。 。aver=sum/m。void score:set_score(float x,int n) /提供成績 int i 。 float sum=0 。m=n 。 。aver=sum/m。void score:print_score(void)/ 輸出成績、平均成績 int i 。for(i=0 。 i<m 。i+)7/10cout<<" &q

18、uot;<<sci 。cout<<" "<<aver<<endl 。問題: 完善類的定義,程序中,處應(yīng)改為: 處應(yīng)改為:/ 程序“ exp_205.cpp ”:用成績類“ score”處理成績:任意個學生,任意科(不超過10科)#include<iostream.h>#include"hscore.h"/ 調(diào)入成績score 類的定義頭文件void input(score *p,int n,int m) 。 /普通函數(shù):輸入學生成績 void print(score *p,int n,int m

19、) 。 /普通函數(shù):輸出學生成績score &average(score *p,int n,int m) 。 /普通函數(shù):平均成績計算void sort(score *p,int n,int m) 。 /普通函數(shù):按平均成績排序void main(void) int n,m 。cout<<" 學生人數(shù): " 。 cin >>n 。cout<<" 考試科數(shù): " 。 cin>>m 。score *p,aver。p=。/動態(tài)數(shù)組:用于處理n 個學生成績if(p=NULL) cout<<&qu

20、ot; 內(nèi)存分配失?。?"<<endl 。 return 。input( )。/ 調(diào)用輸入成績函數(shù)print( ) 。/ 調(diào)用輸出成績函數(shù)aver=average( )。/調(diào)用平均值計算函數(shù)aver.print_score() 。/輸出各科平均成績sort )。/ 成績排序print( ) 。/ 調(diào)用輸出成績函數(shù)。/ 釋放內(nèi)存void input(score *p,int n,int m) int i,j 。 float xM 。 for(i=0 。 i<n 。 i+) cout<<" 第 "<<i+1<<&q

21、uot; 個學生成績: "<<endl 。8/10for(j=0 。 j<m。 j+) cout<<" 第 "<<j+1<<" 科成績: " 。 cin>>xj 。 / 為某個學生對象提供成績void print(score *p,int n,int m)/成績輸出函數(shù) int i 。for(i=0 。 i<n 。 i+)。 / 輸出某學生的成績score &average(score *p,int n,int m) / 用返回引用的方法 int i,j 。 float sM=0。static score aver。/返回的對象必須是靜態(tài)的for(j=0 。 j<m 。j+) for(i=0 。 i<n 。 i+) sj=sj+pi.get_score(j) 。sj=sj/n 。 /對平均成績對象提供值return aver。void sort(score *p,int

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論