




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實驗三類與對象(三一靜態(tài)成員、常量成員、友元、對象成員一、實驗目的理解靜態(tài)數(shù)據成員、靜態(tài)成員函數(shù)的作用,熟悉其應用;理解常量對彖、常量數(shù)據成員、常量成員函數(shù)作用,熟悉相互關系及應用;熟悉友元函數(shù)、友元類的定義及應用;熟悉對象成員(容器類)的應用;進一步熟悉類與對彖的應用及編程。二、實驗學時課內實驗:2課時課外練習:2課時三本實驗涉及的新知識㈠靜態(tài)成員靜態(tài)成員分為靜態(tài)數(shù)據成員及靜態(tài)成員函數(shù)。靜態(tài)數(shù)據成員(1)靜態(tài)數(shù)據成員的定義(類中定義)格式:static類型數(shù)據成員名表;(2)靜態(tài)數(shù)據成員的作用靜態(tài)數(shù)據成員在一個類中只有一個拷貝,屬于一個類(或者說屬于類的第一個對彖),所有對象都共享靜態(tài)成員。靜態(tài)數(shù)據成員是連接各個對象的橋梁,可用來取代全局變量,主要用于各個對彖都共享的公用數(shù)據,如:總數(shù)的統(tǒng)計、平均數(shù)等。(3)說明靜態(tài)數(shù)據成員可以說明為公有成員、私有成員或保護成員,但一般不說明為公有成員:靜態(tài)數(shù)據成員同其它數(shù)據成員一樣,不能在類中進行初始化(不分配內存空間);靜態(tài)數(shù)據成員由于屬于類(不依賴任何對彖),應在程序開始運行時即生成,必須在任何函數(shù)之外進行初始化操作;格式:類型類名::靜態(tài)數(shù)據成員二初值;使用靜態(tài)數(shù)據成員取代全局變量,使數(shù)據更為安全:當在類中需要共享某一數(shù)據成員時通常定義為靜態(tài)數(shù)據成員;靜態(tài)數(shù)據成員與靜態(tài)對彖是兩個完全不同的概念,前者(靜態(tài)數(shù)據成員)是在類中定義的,是類的所有對彖共享的數(shù)據成員,而后者(靜態(tài)對彖)是指對象存儲在靜態(tài)存儲區(qū)。靜態(tài)成員函數(shù)(1)靜態(tài)成員函數(shù)的定義靜態(tài)成員函數(shù)是在定義類的成員函數(shù)時,在成員函數(shù)名前加上statico(2)靜態(tài)成員函數(shù)的調用方法用類名調用格式:類名::靜態(tài)成員函數(shù)名(實參表);用對象調用格式:對象名?靜態(tài)成員函數(shù)名(實參表);(3)說明靜態(tài)成員函數(shù)可以在類內部定義(必須加上static),也可在類外定義,即在類體內聲明,在類體外定義,定義時與普通成員函數(shù)相同;靜態(tài)成員函數(shù)無tlus指針(this指針屬于某一對彖,靜態(tài)成員屬于一個類),只能訪問靜態(tài)數(shù)據成員,不能訪問普通數(shù)據成員,因此靜態(tài)成員函數(shù)專門用來訪問靜態(tài)數(shù)據成員;當在類中定義有靜態(tài)數(shù)據成員時,通常應定義靜態(tài)成員函數(shù)來訪問靜態(tài)數(shù)據成員。㈡常量成員函數(shù)、常量數(shù)據成員及常量對象在C卄中可以用const定義常量對彖(也稱為常對彖)、常量成員函數(shù)(也稱為常成員函數(shù))、常量數(shù)據成員(也稱為常數(shù)據成員)。常量成員函數(shù)的定義(1)在類中定義:返回類型成員函數(shù)名(參數(shù)表)const{函數(shù)體}(2)在類外定義類中聲明:返回類型成員函數(shù)名(參數(shù)表)const;類外定義:返回類型類名::成員函數(shù)名(參數(shù)表)const{函數(shù)體}常量數(shù)據成員的定義定義格式:const數(shù)據類型成員名或:數(shù)據類型const成員名常量對象的定義定義格式:類名const對象名表;或:const類名對象名表說明(1)常量對象只能在定義時初始化,其數(shù)據成員的值不能改變。(2)常量對象只能調用常屋成員函數(shù),不能調用普通成員函數(shù);而普通對象既町調用普通成員函數(shù),也可以調用常量成員函數(shù)。(3)普通成員函數(shù)可以訪問本類的常量成員函數(shù),而常量成員函數(shù)不能訪問本類的普通成員函數(shù)。(4)常量成員函數(shù)與普通成員函數(shù)同名時,構成函數(shù)的重載,其參數(shù)類型和個數(shù)可以相同,而用const加以區(qū)分。(5)常量數(shù)據成員必須在構造函數(shù)中通過初始化列表進行初始化,初始化后值不能改變。(6)常量數(shù)據成員及成員函數(shù)隸屬于某一對彖(與靜態(tài)數(shù)據成員的差異)。㈢友元友元的概念在C卄中提供了一種類以外的函數(shù)訪問類的私有成員、保護成員的方法,即將這些函數(shù)定義為類的友元。友元的種類及應用(1)友元函數(shù)定義方法:在類中進行聲明時,在聲明的前面加上fhend。說明:友元函數(shù)不是類的成員函數(shù),除非確因成員函數(shù)使用頻繁,需要提高程序的執(zhí)行效率而定義為友元函數(shù)外,一般不要定義。友元函數(shù)可以訪問對彖的私有成員和保護成員,只是在類中聲明時加上fnend,但它不是成員函數(shù),定義時不能在函數(shù)名前加上“類名:友元函數(shù)無this指針,一般至少應帶有一個入II參數(shù),通過入II參數(shù)傳遞的對象名來引用該對象的成員。友元函數(shù)主要用于運算符的重載。(2)友元成員友元成員是指一個類的成員函數(shù)可以是另一個類的友友元函數(shù),這樣就可以通過一個類的成員函數(shù)訪問另一個類的私有成員或保護成員。說明:一個類的成員函數(shù)要作為另一個類的友元函數(shù)時,必須先定義這個類。由于友元函數(shù)所在的類名先于類的定義出現(xiàn),應先聲明。(3)友元類友元類是指一個類可以作為另一個類的友元,這樣友元類的所有成員函數(shù)均可以訪問另一個類中的成員。㈣容器類容器類的概念在定義一個類的數(shù)據成員時,除可以是基本數(shù)據成員外,還可以是其它類的對彖,稱為對象成員。含有對彖成員的類稱為容器類。容器類構造函數(shù)(1)格式類名(形參表):成員名1(參數(shù)表1),,成員名n(參數(shù)表11)(2)說明:容器類中至少應有一個構造函數(shù),以通過參數(shù)表為成員對彖賦初值。創(chuàng)建容器類對彖時,先執(zhí)行對彖成員所屬類的構造函數(shù),再執(zhí)行容器類構造函數(shù)的函數(shù)體。釋放容器類對彖時,先調用容器類的析構函數(shù),再調用對象成員所屬類的析構函數(shù)。用容器類對彖調用對彖成員所屬類的公有成員函數(shù)格式:容器類對象成員名?對象成員所屬類名::成員函數(shù)名(實參表);四、實驗內容㈠驗證及認知實驗按要求調試下列程序并回答相關問題。程序1(exp_301.cpp)#iiiclude<iostieam.h>classcounter{private:
staticmtcount;cliarch;public:counter(charc)staticmtcount;cliarch;public:counter(charc)//普通數(shù)據成員〃構造函數(shù){this->count++;ch=c;}voidpiiiit_counter(void){cout?ch?H:,,?count?endl;}-counter(void){count-;}};intcounter::count=100;//靜態(tài)數(shù)據成員賦初值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)運行該程序的輸出結果為由輸出結果可知,靜態(tài)成員屬于?在類中只有拷貝。程序中的“mtcounter::count=100;°的作用是,如果將其放在main()函數(shù)中,重新編譯程序,會出現(xiàn)?其原因是,程序2〃頭文件“hhpoint.h”中point類的定義:classpoint{private:floatx,v;
〃無參構造函數(shù)〃構造函數(shù)重載〃無參構造函數(shù)〃構造函數(shù)重載//拷貝構造函數(shù)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;〃無參構造函數(shù)〃構造函數(shù)重載〃無參構造函數(shù)〃構造函數(shù)重載〃拷貝構造函數(shù)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)}問題:⑷編譯程序,會出現(xiàn),其出錯原因是⑸將程序中(1)改為注釋,再將(2)行首的注釋去掉,再編譯運行程序,程序的輸出結果為:⑹將程序中(3)—(6)行首的注釋去掉,程序的輸出結果為:(7)將程序中的(7)行首的注釋去掉,編譯程序時無錯,而運行程序時會出現(xiàn)錯誤,其原因是。程序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);”表示函數(shù)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類友元函數(shù)};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類友元函數(shù)};voiddisp(giil&g.boy&b)〃定義友元函數(shù):不是類的成員不需要作用域運算符{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);//調用友元函數(shù):與普通函數(shù)調用相同}程序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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年臥式離子風機項目資金申請報告代可行性研究報告
- 2025年廣西安全工程職業(yè)技術學院單招職業(yè)技能測試題庫帶答案
- 2025屆河北省廊坊市高三上學期期末英語試題及答案
- 2025年度建筑改造項目承重墻拆除安全責任免責協(xié)議
- 2025年度拆除施工與建筑垃圾回收合同
- 2025年度電力設施安全保證金合同
- 2025年度廢輪胎回收與橡膠顆粒生產合同
- 2025年度房地產銷售代理與服務合同
- 2025年度醫(yī)療機構與保險公司合作康復服務協(xié)議
- 2025年度工業(yè)廠房轉租租賃合同
- 《市場營銷學》講稿
- 2025年中國陪診服務行業(yè)現(xiàn)狀、發(fā)展環(huán)境及投資前景分析報告
- 靜脈治療相關血管解剖結構與生理
- 統(tǒng)編版九年級道德與法治上冊期中考試卷及答案
- 學校安全隱患報告和舉報獎懲制度
- 福建師范大學《廣告作品賞析》2022-2023學年第一學期期末試卷
- 對外經貿-會計學原理考試答案
- 消渴病中醫(yī)護理
- 大學生職業(yè)素養(yǎng)訓練(第六版)課件 第五單元學會有效溝通
- 醫(yī)院醫(yī)療項目收費管理制度
- 建筑師負責制工程建設項目建筑師標準服務內容與流程
評論
0/150
提交評論