實驗三 類與對象(三)_第1頁
實驗三 類與對象(三)_第2頁
實驗三 類與對象(三)_第3頁
實驗三 類與對象(三)_第4頁
實驗三 類與對象(三)_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實驗三類與對象(三一靜態成員、常量成員、友元、對象成員一、實驗目的理解靜態數據成員、靜態成員函數的作用,熟悉其應用;理解常量對彖、常量數據成員、常量成員函數作用,熟悉相互關系及應用;熟悉友元函數、友元類的定義及應用;熟悉對象成員(容器類)的應用;進一步熟悉類與對彖的應用及編程。二、實驗學時課內實驗:2課時課外練習:2課時三本實驗涉及的新知識㈠靜態成員靜態成員分為靜態數據成員及靜態成員函數。靜態數據成員(1)靜態數據成員的定義(類中定義)格式:static類型數據成員名表;(2)靜態數據成員的作用靜態數據成員在一個類中只有一個拷貝,屬于一個類(或者說屬于類的第一個對彖),所有對象都共享靜態成員。靜態數據成員是連接各個對象的橋梁,可用來取代全局變量,主要用于各個對彖都共享的公用數據,如:總數的統計、平均數等。(3)說明靜態數據成員可以說明為公有成員、私有成員或保護成員,但一般不說明為公有成員:靜態數據成員同其它數據成員一樣,不能在類中進行初始化(不分配內存空間);靜態數據成員由于屬于類(不依賴任何對彖),應在程序開始運行時即生成,必須在任何函數之外進行初始化操作;格式:類型類名::靜態數據成員二初值;使用靜態數據成員取代全局變量,使數據更為安全:當在類中需要共享某一數據成員時通常定義為靜態數據成員;靜態數據成員與靜態對彖是兩個完全不同的概念,前者(靜態數據成員)是在類中定義的,是類的所有對彖共享的數據成員,而后者(靜態對彖)是指對象存儲在靜態存儲區。靜態成員函數(1)靜態成員函數的定義靜態成員函數是在定義類的成員函數時,在成員函數名前加上statico(2)靜態成員函數的調用方法用類名調用格式:類名::靜態成員函數名(實參表);用對象調用格式:對象名?靜態成員函數名(實參表);(3)說明靜態成員函數可以在類內部定義(必須加上static),也可在類外定義,即在類體內聲明,在類體外定義,定義時與普通成員函數相同;靜態成員函數無tlus指針(this指針屬于某一對彖,靜態成員屬于一個類),只能訪問靜態數據成員,不能訪問普通數據成員,因此靜態成員函數專門用來訪問靜態數據成員;當在類中定義有靜態數據成員時,通常應定義靜態成員函數來訪問靜態數據成員。㈡常量成員函數、常量數據成員及常量對象在C卄中可以用const定義常量對彖(也稱為常對彖)、常量成員函數(也稱為常成員函數)、常量數據成員(也稱為常數據成員)。常量成員函數的定義(1)在類中定義:返回類型成員函數名(參數表)const{函數體}(2)在類外定義類中聲明:返回類型成員函數名(參數表)const;類外定義:返回類型類名::成員函數名(參數表)const{函數體}常量數據成員的定義定義格式:const數據類型成員名或:數據類型const成員名常量對象的定義定義格式:類名const對象名表;或:const類名對象名表說明(1)常量對象只能在定義時初始化,其數據成員的值不能改變。(2)常量對象只能調用常屋成員函數,不能調用普通成員函數;而普通對象既町調用普通成員函數,也可以調用常量成員函數。(3)普通成員函數可以訪問本類的常量成員函數,而常量成員函數不能訪問本類的普通成員函數。(4)常量成員函數與普通成員函數同名時,構成函數的重載,其參數類型和個數可以相同,而用const加以區分。(5)常量數據成員必須在構造函數中通過初始化列表進行初始化,初始化后值不能改變。(6)常量數據成員及成員函數隸屬于某一對彖(與靜態數據成員的差異)。㈢友元友元的概念在C卄中提供了一種類以外的函數訪問類的私有成員、保護成員的方法,即將這些函數定義為類的友元。友元的種類及應用(1)友元函數定義方法:在類中進行聲明時,在聲明的前面加上fhend。說明:友元函數不是類的成員函數,除非確因成員函數使用頻繁,需要提高程序的執行效率而定義為友元函數外,一般不要定義。友元函數可以訪問對彖的私有成員和保護成員,只是在類中聲明時加上fnend,但它不是成員函數,定義時不能在函數名前加上“類名:友元函數無this指針,一般至少應帶有一個入II參數,通過入II參數傳遞的對象名來引用該對象的成員。友元函數主要用于運算符的重載。(2)友元成員友元成員是指一個類的成員函數可以是另一個類的友友元函數,這樣就可以通過一個類的成員函數訪問另一個類的私有成員或保護成員。說明:一個類的成員函數要作為另一個類的友元函數時,必須先定義這個類。由于友元函數所在的類名先于類的定義出現,應先聲明。(3)友元類友元類是指一個類可以作為另一個類的友元,這樣友元類的所有成員函數均可以訪問另一個類中的成員。㈣容器類容器類的概念在定義一個類的數據成員時,除可以是基本數據成員外,還可以是其它類的對彖,稱為對象成員。含有對彖成員的類稱為容器類。容器類構造函數(1)格式類名(形參表):成員名1(參數表1),,成員名n(參數表11)(2)說明:容器類中至少應有一個構造函數,以通過參數表為成員對彖賦初值。創建容器類對彖時,先執行對彖成員所屬類的構造函數,再執行容器類構造函數的函數體。釋放容器類對彖時,先調用容器類的析構函數,再調用對象成員所屬類的析構函數。用容器類對彖調用對彖成員所屬類的公有成員函數格式:容器類對象成員名?對象成員所屬類名::成員函數名(實參表);四、實驗內容㈠驗證及認知實驗按要求調試下列程序并回答相關問題。程序1(exp_301.cpp)#iiiclude<iostieam.h>classcounter{private:

staticmtcount;cliarch;public:counter(charc)staticmtcount;cliarch;public:counter(charc)//普通數據成員〃構造函數{this->count++;ch=c;}voidpiiiit_counter(void){cout?ch?H:,,?count?endl;}-counter(void){count-;}};intcounter::count=100;//靜態數據成員賦初值voidniam(void){countercl(A*);cl.print_counter();cout?endl;counterc2(,B,);cl.print_counter();c2.print_counter();cout?endl;counterc3(C);cl.print_counter();c2.print_counter();c3.print_counter();}問題:(1)運行該程序的輸出結果為由輸出結果可知,靜態成員屬于?在類中只有拷貝。程序中的“mtcounter::count=100;°的作用是,如果將其放在main()函數中,重新編譯程序,會出現?其原因是,程序2〃頭文件“hhpoint.h”中point類的定義:classpoint{private:floatx,v;

〃無參構造函數〃構造函數重載〃無參構造函數〃構造函數重載//拷貝構造函數pomt(void){x=O;y=O;}point(floata.floatb){x=a;y=b;}point(constpoint&ob){x=ob.x;y=ob.y;}voidset_point(floata.floatb);floatread_x(void);floatread_y(void);voidmove(floata,floatb);voidpiiiit(void);};voidpoint::set_pomt(floata.floatb){x=a;y=b;}floatpomt::read_x(void){retunix;}floatpomt::read_y(void){retuniy;}voidpoint::move(floata.floatb){x+=a;y+=b;}voidpoint::piint(void){cout?Hx=H?x?Mv=n?y?endl;}〃頭文件Joint.h”中point類的定義:classpoint{private:floatx、y;〃無參構造函數〃構造函數重載〃無參構造函數〃構造函數重載〃拷貝構造函數pomt(void){x=O;y=O;}point(floata.floatb){x=a;y=b;}point(constpoint&ob){x=ob.x;y=ob.y;}voidset_point(floata.floatb);floatread_x(void);floatread_y(void);floatread_x(void)const;floatread_y(void)const;voidmove(floata,floatb);voidmove(floata,floatb)const;};voidpoint::set_pomt(floata.floatb){x=a;y=b;}floatpomt::read_x(void){retunix;}floatpomt::read_y(void){retuniy;}voidpoint::move(floata.floatb){x+-a;y+=b;}floatpomt::read_x(void)const{retunix;}floatpomt::read_y(void)const{retuniy;}//voidpoint::move(floata,floatb)const//(8)〃{x+=a;y+=b;}//(9)〃文件“exp_302.cpp”中定義的測試程序:#mclude<iostieam.h>#mclude,,lilipomt.hH//(I)//#iiicludenpoint.hM//(2)voidniam(void){constpointcentei(100.100);pointp(20,40);cout?,,Befbremoving:"?endl:cout?Hp:',?Mx=H?p.read_x();cout?My=u?p.read_yQ?endl;cout?Mcenter:H?Mx=M?center.read_xO;cout?My=n?center.read_y()?endl://p.move(10,20);〃⑶//cout?HAftermoving:H?endl;//(4)//cout?Hp:H?Hx=H?p.iead_x();〃⑸//cout?Hy=M?p.iead_y()?eiidl;〃(6)//center.move(20.20);〃(7)}問題:⑷編譯程序,會出現,其出錯原因是⑸將程序中(1)改為注釋,再將(2)行首的注釋去掉,再編譯運行程序,程序的輸出結果為:⑹將程序中(3)—(6)行首的注釋去掉,程序的輸出結果為:(7)將程序中的(7)行首的注釋去掉,編譯程序時無錯,而運行程序時會出現錯誤,其原因是。程序3(亡xp_303.cpp)#mclude<iostieam.h>#mclude<stimg.h>classgirl{private:char*naine;mtage;public:gi【l(char*na,mtn){name=newchai[strlen(na)+l];strcpy(nameaia);age=n;}^giil(void){deletename;}〃釋放new分配的內存char*get_name(void){retuniname;}mtget_age(void){retuniage;}voidpimt_girl(void);};voidgirt:piiiit_girl(void){cout?H姓名:n?name;cout?M年齡:,,?age?endl;}voiddisp(giil&g){cout?H姓名:M?;cout?M年齡:,,?g.age?endl;}voidniaiii(void){giiigl(H李小丫“,⑵,g2(”王永蘭“,15),g3(”趙夢美”」3);cout?M姓名:,,?gl.get_name();

cout?M年齡:H?gl.get_age()?endl;g2.pnnt_gul();disp(g3);}問題:⑻編譯程序出錯的原因是⑼在girl類中加上afriendvoiddisp(girl&g);”重新編譯、運行程序,其輸出結果為:其中friendvoiddisp(gul&g);”表示函數disp()為girl類的°㈡知識應用實驗1.分析下列程序,寫出程序的輸出結果,再上機運行程序驗證其正確性,如果不正確,請認真分析出錯原因。程序4(exp_304.cpp)#mclude<iostieam.h>classsunpie#mclude<iostieam.h>classsunpie{private:staticmtvl,v2?v3;public:smiple(intx=0,inty=0){vl=x;v2=y;}staticvoidsum(void)你分析的程序輸出結呆是:程序的實際輸出結果是:mtget_v3(void){returnv3;}intsunpie::vl=0;intsunpie::v2=0;intsunpie::v3=0;voidniaiii(void){simpleobi(5,10);obl.suniQ;cout?M(l):H?ob1.get_v3()?endl;sunpieob2(10,20);sunpie::sum();cout?M(2):H?ob2.get_v3()?endl;程序5(exp_3O5.cpp)#mclude<iostieam.h>你分析的程序輸出結果是:#mclude<stimg.h>你分析的程序輸出結果是:classboy;//類boy的聲明;classgill{private:char*naine;mtage;public:程序的實際輸出結果是:giil(char*na,mtn){name=newchai[strlen(na)+l];strcpy(nameaia);age=n;}^giil(void){deletename;}〃釋放new分配的內存friendvoiddisp(girl&g,boy&b);〃聲明disp為gill類友元函數};classbovJ{private:char*naine;mtage;public:boy(char*na,iiitn){name=newchai[strlen(na)+l];strcpy(nameaia);age=n;}^bov(void){deletename;}〃釋放new分配的內存friendvoiddisp(girl&g,boy&b);〃聲明disp為boy類友元函數};voiddisp(giil&g.boy&b)〃定義友元函數:不是類的成員不需要作用域運算符{cout?'f女孩姓名:”;cout?M年齡:,,?g.age?endl;cout?M男孩姓名:H?;cout?M年齡:y<b?age?endl;}voidniaiii(void){giiigl(”李小丫”,12);boybl(”張海兵”,15);disp(gl,bl);//調用友元函數:與普通函數調用相同}程序6你分析的程序輸出結果是:〃頭文件"hdate.h"的內容:〃定義"date"類classdate

你分析的程序輸出結果是:{private:intyeai;month.day;public:date(void)程序的實際輸出結果是:{yeai-1980;month=1;day=1;}date(iiitvjntm.iiitd)程序的實際輸出結果是:{year=y;month=m;day=d;}mtget_yeai(void){returnyear;}mtget_month(void){returnmonth;}mtget_day(void){returnday;}};〃頭文件“hpeison?h”的內容:定義“pereon”類#mclude<stimg.h>#mcludeHhdate.hHclassperson{private:cliar*naine;charsex[2];datebmhday;public:person(char*na,charyiiitd):buthday(y,nLd){name=newchai[strlen(na)+l];strcpy(nameaia);strcpy(sex.s);}char*get_name(void){returnname;}char*get_sex(void){returnsex;}mtget_yeai(void){ieturnbmhday.get_yearQ;}mtget_month(void){returnbutliday.get_month();}mtget_day(void){returnbmhday.get_dav();}-person(void){delete[]name;}voidpiiiit(void);};voidperson::pimt(void){cout?H姓名:,,?name?endl;cout?M性別:,,?sex?endl;cout?M出生日期:,,?birthday.get_year()?H年典;cout?bmhday.get_month()?H月”;cout?biithdayget_day()?"口H?endl;}〃測試程序"exp.306.cpp"#mclude<iostieam.h>#mcludeHhperson.hHvoidniaiii(void){personpsl(”張小三丁男7985)2,15);personps2「李小丫丁女”,1986,3,9);psl.priiitQ;cout?e

溫馨提示

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

評論

0/150

提交評論