第二章類與對象_第1頁
第二章類與對象_第2頁
第二章類與對象_第3頁
第二章類與對象_第4頁
第二章類與對象_第5頁
已閱讀5頁,還剩164頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第二章類與對象第一頁,共一百八十五頁,編輯于2023年,星期四本章主要內(nèi)容面向?qū)ο蟮乃枷腩惛拍詈吐暶黝惖某蓡T構(gòu)造函數(shù)與析構(gòu)函數(shù)用const保護(hù)數(shù)據(jù)友元靜態(tài)成員this指針第二頁,共一百八十五頁,編輯于2023年,星期四重點(diǎn):根據(jù)具體問題的算法編寫程序,重點(diǎn)考慮本問題的解決方法和流程形式:主模塊+若干個(gè)子模塊(main()+子函數(shù))。每個(gè)函數(shù)實(shí)現(xiàn)一項(xiàng)功能特點(diǎn):設(shè)計(jì)者必須考慮每一個(gè)細(xì)節(jié)數(shù)據(jù)與函數(shù)分離,所有數(shù)據(jù)都是公用的。面向過程設(shè)計(jì)方法回顧§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)第三頁,共一百八十五頁,編輯于2023年,星期四缺點(diǎn):數(shù)據(jù)與代碼分離導(dǎo)致數(shù)據(jù)改變時(shí)需重新編寫函數(shù)程序功能擴(kuò)充時(shí)程序的可重用性差,效率低。面向過程設(shè)計(jì)方法回顧§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)主函數(shù)函數(shù)1函數(shù)2函數(shù)3函數(shù)11函數(shù)12函數(shù)31函數(shù)32數(shù)據(jù)1數(shù)據(jù)2數(shù)據(jù)3第四頁,共一百八十五頁,編輯于2023年,星期四例:編寫小型公司人員信息管理系統(tǒng)某小型公司主要有人員,經(jīng)理、兼職技術(shù)人員、銷售經(jīng)理和兼職推銷員?,F(xiàn)在需要存儲這些人員的姓名、編號、級別、當(dāng)月薪水、計(jì)算月薪總額并顯示全部信息。月薪計(jì)算方法:經(jīng)理拿固定月薪8000元兼職技術(shù)人員按每小時(shí)100元領(lǐng)取月薪兼職推銷員月薪按當(dāng)月銷售額的4%提成銷售經(jīng)理既拿固定月薪也領(lǐng)取銷售提成,固定月薪為5000元,銷售提成為所管轄部門當(dāng)月銷售額的5‰。面向過程設(shè)計(jì)方法回顧§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)第五頁,共一百八十五頁,編輯于2023年,星期四分析:一般數(shù)據(jù)描述用結(jié)構(gòu)體

structemployee

{ char*name;//姓名

intno;//編號

char*job;//職位

floatpaytotal;//月薪總額

floathourlyRate; //每小時(shí)酬金

intworkHours; //當(dāng)月工作時(shí)數(shù) floatCommRate; //銷售額提取百分比 floatsales; //當(dāng)月銷售額}不同職位月薪計(jì)算方法和需要數(shù)據(jù)個(gè)數(shù)不同,專用與公用數(shù)據(jù)混雜,數(shù)據(jù)結(jié)構(gòu)過于龐大,結(jié)構(gòu)不清面向過程設(shè)計(jì)方法回顧§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)第六頁,共一百八十五頁,編輯于2023年,星期四程序結(jié)構(gòu):函數(shù):employee*input()輸入全部數(shù)據(jù)必須輸入全部數(shù)據(jù),即使不使用的部分專有數(shù)據(jù)也不例外,且輸入順序要與數(shù)據(jù)文件順序匹配月薪計(jì)算函數(shù)pay利用函數(shù)重載編寫各類人員月薪計(jì)算函數(shù)pay,這樣主函數(shù)中必須要有相應(yīng)分支結(jié)構(gòu),按職位調(diào)用相應(yīng)pay函數(shù)voidoutput(employeeperson)輸出全部數(shù)據(jù)除輸出公用數(shù)據(jù)外,其中應(yīng)有分支結(jié)構(gòu),根據(jù)職位不同輸出其專有數(shù)據(jù)。如:兼職技術(shù)人員要輸出每小時(shí)薪金數(shù)及小時(shí)數(shù)等信息面向過程設(shè)計(jì)方法回顧§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)第七頁,共一百八十五頁,編輯于2023年,星期四分析:修改:添加鐘點(diǎn)工:4小時(shí)以內(nèi)每小時(shí)5元,4小時(shí)以上每小時(shí)8元。程序修改范圍:添加pay函數(shù),修改所有其他函數(shù)包括main函數(shù)包括數(shù)據(jù)文件結(jié)論:面向過程的程序設(shè)計(jì)在程序的通用性、擴(kuò)展性方面存在缺陷。面向過程設(shè)計(jì)方法回顧§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)第八頁,共一百八十五頁,編輯于2023年,星期四§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)觀點(diǎn):從程序的通用性入手,將程序潛在使用者作為對象進(jìn)行全面研究。認(rèn)為所有問題由彼此相關(guān)且能夠相互通信的實(shí)體(對象)所組成,并總結(jié)出對象的共性特點(diǎn)。例:公司:問題。公司中的一個(gè)人員:對象。特點(diǎn):每個(gè)對象都有自己的特征(對象的屬性)(數(shù)據(jù))每個(gè)對象都有自己的行為。(操作)例:王經(jīng)理有自己的編號、月薪等數(shù)據(jù)屬性和自己的行為:月薪計(jì)算函數(shù)要求:高度概括、分類、和抽象現(xiàn)實(shí)問題。將數(shù)據(jù)與對數(shù)據(jù)進(jìn)行的操作封裝。面向?qū)ο蟮乃枷氲诰彭摚惨话侔耸屙?,編輯?023年,星期四抽象:將研究對象(問題)分類并總結(jié)出每類對象的公共性質(zhì)并加以描述將具有相同結(jié)構(gòu)和特性的一批對象總結(jié)出來用“類”這種數(shù)據(jù)結(jié)構(gòu)描述,稱為對象的抽象數(shù)據(jù)抽象:總結(jié)出同類對象的基本特點(diǎn)(屬性)用物理量(變量等)描述代碼抽象:總結(jié)出同類對象的共有的行為特征(操作或具有的功能),編寫相應(yīng)專用函數(shù)例:編寫兼職技術(shù)人員的月薪計(jì)算函數(shù)§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟮幕咎攸c(diǎn)第十頁,共一百八十五頁,編輯于2023年,星期四封裝:將數(shù)據(jù)和操作放在一起,視為一個(gè)整體稱為類,與外界相對分隔。面向?qū)ο蟮幕咎攸c(diǎn)§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)類數(shù)據(jù)操作代碼例:兼職技術(shù)人員特有數(shù)據(jù):每小時(shí)薪金數(shù)和月工作時(shí)間特有代碼:求月薪函數(shù)封裝成:技術(shù)人員類第十一頁,共一百八十五頁,編輯于2023年,星期四§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)例:兼職技術(shù)人員的封裝classtechnician:publicemployee

//技術(shù)人員類{private: floathourlyRate; //每小時(shí)酬金 intworkHours; //當(dāng)月工作時(shí)數(shù)public: voidpay()//計(jì)算月薪函數(shù) { cin>>workHours; accumPay=hourlyRate*workHours; } };第十二頁,共一百八十五頁,編輯于2023年,星期四§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)封裝特點(diǎn):數(shù)據(jù)只能在內(nèi)部使用,外界及其他類只能通過程序接口聯(lián)系,可以保護(hù)數(shù)據(jù)使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),只通過外部接口以特定的訪問權(quán)限,使用類的成員程序擴(kuò)充功能時(shí)可直接編寫新的封裝模塊,設(shè)計(jì)接口接入程序即可面向?qū)ο蟮幕咎攸c(diǎn)第十三頁,共一百八十五頁,編輯于2023年,星期四§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)繼承與派生:在一個(gè)類基礎(chǔ)上可派生出新的類新類繼承原類的所有成員并可產(chǎn)生新的功能實(shí)際操作時(shí)通常將所有對象共用的數(shù)據(jù)及操作作為基礎(chǔ)類,不同對象專有數(shù)據(jù)都從基類中派生得出面向?qū)ο蟮幕咎攸c(diǎn)第十四頁,共一百八十五頁,編輯于2023年,星期四面向?qū)ο蟮幕咎攸c(diǎn)§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)基類公共數(shù)據(jù)操作代碼經(jīng)理數(shù)據(jù)操作代碼技術(shù)人員數(shù)據(jù)操作代碼銷售人員數(shù)據(jù)操作代碼鐘點(diǎn)工數(shù)據(jù)操作代碼第十五頁,共一百八十五頁,編輯于2023年,星期四§2.1面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)總結(jié):抽象:將對象分類,并總結(jié)同類對象的數(shù)據(jù)屬性和相應(yīng)代碼(函數(shù))封裝:將同類對象所屬數(shù)據(jù)及函數(shù)封裝在一個(gè)類中派生:類復(fù)雜時(shí),將許多類的共同屬性及代碼用一個(gè)公用類(基類)封裝,自己類的特有屬性及代碼用從公用類派生出的派生類封裝第十六頁,共一百八十五頁,編輯于2023年,星期四§2.2類與對象的定義第二章類和對象第十七頁,共一百八十五頁,編輯于2023年,星期四類是一種用戶自定義類型,它是從結(jié)構(gòu)體引申而來:structstudent{ intnum; charname[10]; intscore;};studentstu,stu2;結(jié)構(gòu)體只包括數(shù)據(jù),沒有操作,結(jié)構(gòu)體成員在本作用域中是“敞開”的,使用不受限制§2.2類與對象的定義類的引入|結(jié)構(gòu)體擴(kuò)展第十八頁,共一百八十五頁,編輯于2023年,星期四§2.2類與對象的定義結(jié)構(gòu)體成員在任何函數(shù)中均可用直接使用

格式:結(jié)構(gòu)體變量名.成員名voidmain()//no2.2-1.cpp{ studentstu; cin>>stu.num>>>>stu.score; display(stu);}voiddisplay(studentstu){ cout<<stu.num<<<<stu.score<<endl;}類的引入|結(jié)構(gòu)體擴(kuò)展第十九頁,共一百八十五頁,編輯于2023年,星期四結(jié)構(gòu)體類型的擴(kuò)展-在定義中加入代碼(函數(shù)):structstudent{ intnum; charname[10]; intscore;

voiddisplay() {cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"score:"<<score<<endl; }};§2.2類與對象的定義數(shù)據(jù)成員函數(shù)成員(代碼)擴(kuò)展的結(jié)構(gòu)體student實(shí)現(xiàn)了將數(shù)據(jù)與對此數(shù)據(jù)進(jìn)行的操作封裝在一起的功能類的引入|結(jié)構(gòu)體擴(kuò)展數(shù)據(jù)是內(nèi)部成員,直接使用第二十頁,共一百八十五頁,編輯于2023年,星期四封裝后的結(jié)構(gòu)體仍然開放,所有成員均可直接使用,但須按格式使用包括函數(shù)成員。voidmain()//no2.2-1A.cpp{ studentstu; cout<<"pleaseinputdata:"; cin>>stu.num>>>>stu.score;

stu.display();}封裝后的結(jié)構(gòu)體仍然開放,所有成員均可直接使用§2.2類與對象的定義類的引入|結(jié)構(gòu)體擴(kuò)展第二十一頁,共一百八十五頁,編輯于2023年,星期四為保護(hù)專有數(shù)據(jù)兼顧外界使用,設(shè)置訪問權(quán)限,讓專有成員只能內(nèi)部使用,公開成員則任意使用stuctstudent{private: intnum; charname[10]; charsex;

public: voiddisplay() {cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; }};§2.2類與對象的定義私有成員,只能內(nèi)部使用公有成員,外界可以調(diào)用類的引入|結(jié)構(gòu)體擴(kuò)展第二十二頁,共一百八十五頁,編輯于2023年,星期四設(shè)置訪問權(quán)限后,主函數(shù)作為外部,只能使用公有成員。voidmain(){ studentstu; cout<<"pleaseinputdata:"; cin>>

stu.num>>

>>stu.score;

stu.display();}§2.2類與對象的定義類的引入|結(jié)構(gòu)體擴(kuò)展正確:公有函數(shù)可以使用錯(cuò)誤:私有成員不可使用第二十三頁,共一百八十五頁,編輯于2023年,星期四解決方案:繞彎使用,增加公有成員函數(shù)間接使用內(nèi)部成員structstudent{private: intnum; charname[10]; charsex;

public: voidinput()

{ cout<<"pleaseinputdata:"; cin>>num>>name>>score; } voiddisplay() {cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; }};類的引入|結(jié)構(gòu)體擴(kuò)展為外部使用增加的公有函數(shù)前一頁下一頁第二十四頁,共一百八十五頁,編輯于2023年,星期四主函數(shù)通過公有函數(shù)input間接使用內(nèi)部成員voidmain()//no2.2-1B.cpp{ studentstu;

stu.input();

stu.display();}§2.2類與對象的定義類的引入|結(jié)構(gòu)體擴(kuò)展注意:必須用“變量名.函數(shù)名”的格式使用第二十五頁,共一百八十五頁,編輯于2023年,星期四§2.2類與對象的定義總結(jié):通過擴(kuò)展結(jié)構(gòu)體數(shù)據(jù)類型,增加函數(shù)成員和訪問權(quán)限,使結(jié)構(gòu)體實(shí)現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)中的封裝為更好進(jìn)行面向?qū)ο蟪绦蛟O(shè)計(jì),將擴(kuò)展的結(jié)構(gòu)體類型改造產(chǎn)生新的數(shù)據(jù)類型-類類和結(jié)構(gòu)體有著相似的結(jié)構(gòu),但更為復(fù)雜,功能更加擴(kuò)展,能夠?qū)崿F(xiàn)更加復(fù)雜的面向?qū)ο蟮某绦蛟O(shè)計(jì)類的引入|結(jié)構(gòu)體擴(kuò)展第二十六頁,共一百八十五頁,編輯于2023年,星期四類的一般聲明形式:class類名稱{ private:

私有數(shù)據(jù)和成員函數(shù) protected:

保護(hù)型數(shù)據(jù)和成員函數(shù) public:

公有數(shù)據(jù)和成員函數(shù)

};類的定義§2.2類與對象的定義類關(guān)鍵字成員定義訪問權(quán)限第二十七頁,共一百八十五頁,編輯于2023年,星期四§2.2類與對象的定義

例:classABC{

private:

inta;protected:

intb; voidset(intx,inty,intz){a=x;b=y;c=z;}public:

intc; voidprint(){cout<<a<<b<<c<<endl;}};私有成員:變量a保護(hù)成員:變量b及函數(shù)set公有成員:變量c及函數(shù)print類的聲明形式第二十八頁,共一百八十五頁,編輯于2023年,星期四公有權(quán)限:在關(guān)鍵字public后面聲明,是類與外部的接口,任何外部函數(shù)都可以訪問。私有權(quán)限:在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。類的訪問權(quán)限§2.2類與對象的定義第二十九頁,共一百八十五頁,編輯于2023年,星期四在關(guān)鍵字protected后面聲明,與private類似,其差別表現(xiàn)在繼承與派生時(shí)對派生類的影響不同?!?.2類與對象的定義類的訪問權(quán)限第三十頁,共一百八十五頁,編輯于2023年,星期四classABC{

inta;protected:

intb;public:

intc; voidset(intx,inty,intz){a=x;b=y;c=z;} voidprint(){cout<<"a="<<a<<'\n'<<"b="<<b

<<'\n'<<"c="<<c<<endl;}};注意:內(nèi)部函數(shù)可以使用全部數(shù)據(jù)成員而外部(如主函數(shù)中)只能使用公有數(shù)據(jù)成員c及公有函數(shù)成員set和print且必須通過對象使用不同權(quán)限的成員例前一頁下一頁休息休息默認(rèn)權(quán)限為private第三十一頁,共一百八十五頁,編輯于2023年,星期四§2.2類與對象的定義類的對象是該類的某一特定實(shí)體,即類類型的變量定義形式:

存儲類型

類名

對象名;舉例:

ABC

d1;定義的三種方式:先定義類,后定義對象;定義類的同時(shí),定義對象;無類名,直接定義對象對象的定義第三十二頁,共一百八十五頁,編輯于2023年,星期四§2.2類與對象的定義對象與結(jié)構(gòu)體變量一樣,一般不能整體使用,只能使用成員一般格式:

對象名.成員名上例:如已有定義:ABCd1;則:

d1.c=28;d1.set(1,2,3);都是正確的對象使用對象的使用定義第三十三頁,共一百八十五頁,編輯于2023年,星期四§2.2類與對象的定義對象的位置在類外,因此不是所有類的成員都能通過對象使用,它受到訪問權(quán)限的限制。只有public屬性的成員可以通過對象在類外使用例:cout<<d1.c<<endl;

cout<<d1.a<<d1.b<<endl;╳對象的使用定義第三十四頁,共一百八十五頁,編輯于2023年,星期四§2.2類與對象的定義提醒:類中的成員函數(shù)要使用數(shù)據(jù)成員時(shí)不受訪問權(quán)限的限制使用方法:直接使用成員名例:ABC類的成員函數(shù)set中:

a=x;b=y;c=z;其中a、b是禁止外界使用的私有和保護(hù)成員,而c是任意使用的公有成員對象的使用定義第三十五頁,共一百八十五頁,編輯于2023年,星期四例:不同類型成員的使用classABC{

inta;protected:

intb;public:

intc; voidset(intx,inty,intz){a=x;b=y;c=z;} voidprint(){cout<<"a="<<a<<'\n'<<"b="<<b

<<'\n'<<"c="<<c<<endl;}};類中成員的訪問實(shí)例前一頁下一頁休息休息類中訪問直接用成員名且不受權(quán)限限制第三十六頁,共一百八十五頁,編輯于2023年,星期四voidmain()//no2.2-2.cpp{ intx,y,z; ABCabc;abc.c=10;//類外訪問:公有成員直接引用abc.a=5;abc.b=8;

//私有及保護(hù)成員不能直接引用//私有及保護(hù)成員只能通過公有成員函數(shù)引用 cout<<"pleaseinputdata:"; cin>>x>>y>>z;

abc.set(x,y,z);

abc.print();}類中成員的訪問方式前一頁休息休息下一頁第三十七頁,共一百八十五頁,編輯于2023年,星期四例:類外通過公有成員函數(shù)使用私有和保護(hù)成員classABC{

inta;protected:

intb;public:

intc; voidset(intx,inty,intz){a=x;b=y;c=z;} intgeta(){returna;} intgetb(){returnb;} voidprint(){cout<<"a="<<a<<'\n'<<"b="<<b

<<'\n'<<"c="<<c<<endl;}};類中成員的訪問方式前一頁下一頁休息休息第三十八頁,共一百八十五頁,編輯于2023年,星期四voidmain(){ intx,y,z,d; ABCabc;

abc.c=10;//公有成員直接引用 cout<<"c="<<abc.c<<endl; cout<<"pleaseinputdata:"; cin>>x>>y>>z;

abc.set(x,y,z);

//私有及保護(hù)成員只能通過公有成員函數(shù)引用abc.print(); d=abc.geta()+abc.getb()+abc.c; cout<<"d="<<d<<endl;}類中成員的訪問方式前一頁休息休息下一頁第三十九頁,共一百八十五頁,編輯于2023年,星期四成員函數(shù):成員函數(shù)可是帶缺省形參值的函數(shù)。成員函數(shù)可以重載成員函數(shù)較長時(shí)可寫在類定義外面

此時(shí)函數(shù)首行形式為:

函數(shù)類型類名::函數(shù)名(形參表)成員函數(shù)的特殊性成員函數(shù)的變化實(shí)例1實(shí)例2實(shí)例3第四十頁,共一百八十五頁,編輯于2023年,星期四#include<iostream.h>//no2.2-3.cppclassPoint

//Point類通常表示平面坐標(biāo)上的點(diǎn){public: voidSet(intxx=0,intyy=0) { X=xx;Y=yy; } intGetX(){returnX;}//為外界取X值 intGetY(){returnY;}//為外界取Y值private: intX,Y;};下一頁前一頁休息休息第四十一頁,共一百八十五頁,編輯于2023年,星期四voidmain(){ Pointp; //定義Point類的對象 p.Set(10,4); cout<<"NO1:x="<<p.GetX(); cout<<"y="<<p.GetY()<<endl; p.Set(); cout<<"NO2:x="<<p.GetX(); cout<<"y="<<p.GetY()<<endl;}執(zhí)行結(jié)果:NO1:x=10y=4NO2:x=0y=0下一頁前一頁休息休息返回第四十二頁,共一百八十五頁,編輯于2023年,星期四#include<iostream.h>//no2.2-3A.cppclassPoint

//Point類通常表示平面坐標(biāo)上的點(diǎn){public: voidSet()//無參Set函數(shù) { X=0;Y=0;} voidSet(intxx,intyy)//重載有參Set函數(shù) { X=xx;Y=yy;} intGetX(){returnX;}//為外界取X值 intGetY(){returnY;}//為外界取Y值private: intX,Y;};下一頁前一頁休息休息第四十三頁,共一百八十五頁,編輯于2023年,星期四voidmain(){ Pointp; //定義Point類的對象 p.Set(10,4); cout<<"NO1:x="<<p.GetX(); cout<<"y="<<p.GetY()<<endl; p.Set(); cout<<"NO2:x="<<p.GetX(); cout<<"y="<<p.GetY()<<endl;}執(zhí)行結(jié)果:NO1:x=10y=4NO2:x=0y=0下一頁前一頁休息休息返回第四十四頁,共一百八十五頁,編輯于2023年,星期四classstudent

//no2.2-4.cpp{intnum; charname[10]; charsex;

public:

voiddisplay(intn,charnam[],chars);};void

student::display(intn,charnam[],chars){ num=n;sex=s; strcpy(name,nam); cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl; }休息休息下一頁前一頁第四十五頁,共一百八十五頁,編輯于2023年,星期四voidmain(){ studstud1; stud1.display(21001,"林華",'w');}執(zhí)行結(jié)果:num:21001name:林華sex:w下一頁休息休息前一頁返回第四十六頁,共一百八十五頁,編輯于2023年,星期四函數(shù)體在類的聲明中定義實(shí)際上是一種內(nèi)聯(lián)成員函數(shù)。為了提高運(yùn)行時(shí)的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語句和switch語句)。還可使用inline關(guān)鍵字在函數(shù)外定義內(nèi)聯(lián)成員函數(shù)。成員函數(shù)的特殊性內(nèi)聯(lián)成員函數(shù)第四十七頁,共一百八十五頁,編輯于2023年,星期四classPoint//點(diǎn)類用于描述一個(gè)點(diǎn)的坐標(biāo){public:voidInit(intinitX,intinitY);intGetX(),GetY();private:intX,Y;};inlinevoidPoint::Init(intinitX,intinitY){X=initX;Y=initY;}inlineintPoint::GetX(){returnX;}inlineintPoint::GetY(){returnY;}前一頁下一頁休息休息成員函數(shù)的特殊性第四十八頁,共一百八十五頁,編輯于2023年,星期四intmain()//no2.2-5.cpp{ PointA; A.Init(1,2); cout<<A.GetX()<<'\t'<<A.GetY()<<endl; return0;}§2.2類與對象的定義成員函數(shù)的特殊性第四十九頁,共一百八十五頁,編輯于2023年,星期四形式上:類與結(jié)構(gòu)體類同。相同:都可以有成員,都可以使用限定訪問權(quán)限的關(guān)鍵字(private,public和protected),引用的形式相同。區(qū)別:類中缺省的訪問權(quán)限是私有的,而在結(jié)構(gòu)體中缺省的訪問權(quán)限是公有的。可以認(rèn)為結(jié)構(gòu)體是類的一個(gè)特例。類的其他性質(zhì)§2.2類與對象的定義第五十頁,共一百八十五頁,編輯于2023年,星期四類的應(yīng)用舉例一圓型游泳池如圖所示,現(xiàn)在需在其周圍建一圓型過道,并在其四周圍上柵欄。柵欄價(jià)格為35元/米,過道造價(jià)為20元/平方米。過道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計(jì)算并輸出過道和柵欄的造價(jià)。游泳池過道第五十一頁,共一百八十五頁,編輯于2023年,星期四類的應(yīng)用舉例分析:算法:柵欄造價(jià)=單價(jià)×大圓周長過道造價(jià)=單價(jià)×(大圓面積–小圓面積)數(shù)據(jù)結(jié)構(gòu):反復(fù)進(jìn)行圓計(jì)算,考慮定義圓類Cirle數(shù)據(jù)成員:小圓半徑:floatradius;

大圓半徑比小圓固定大3,直接運(yùn)算

造價(jià)和單價(jià)與圓無關(guān)不編入圓類函數(shù)成員voidInit(floatr):為半徑賦值floatCircumference():求圓周長floatArea():求圓面積第五十二頁,共一百八十五頁,編輯于2023年,星期四#include<iostream.h>//no2.2-6.cppconstfloatPI=3.14159;constfloatFencePrice=35;constfloatConcretePrice=20;//聲明類Circle及其數(shù)據(jù)和方法classCircle{private:floatradius;

public:voidInit(floatr);//賦值函數(shù)floatCircumference();//圓周長floatArea();//圓面積};下一頁前一頁休息休息第五十三頁,共一百八十五頁,編輯于2023年,星期四//類的實(shí)現(xiàn)//為數(shù)據(jù)成員radius賦值voidCircle::Init(floatr){radius=r;}//計(jì)算圓的周長floatCircle::Circumference(){return2*PI*radius;}

//計(jì)算圓的面積

floatCircle::Area(){returnPI*radius*radius;}下一頁前一頁休息休息第五十四頁,共一百八十五頁,編輯于2023年,星期四voidmain(){ floatradius; floatFenceCost,ConcreteCost;

//提示用戶輸入半徑 cout<<"Entertheradiusofthepool:"; cin>>radius;

//聲明Circle對象并賦值 CirclePool,PoolRim; Pool.Init(radius); PoolRim.Init(radius+3);前一頁下一頁休息休息第五十五頁,共一百八十五頁,編輯于2023年,星期四//計(jì)算柵欄造價(jià)并輸出FenceCost=PoolRim.Circumference()*FencePrice;cout<<"FencingCostis¥"<<FenceCost<<endl;

//計(jì)算過道造價(jià)并輸出ConcreteCost=(PoolRim.Area()-Pool.Area())*ConcretePrice;cout<<"ConcreteCostis¥"<<ConcreteCost<<endl;}運(yùn)行結(jié)果Entertheradiusofthepool:10FencingCostis¥2858.85ConcreteCostis¥4335.39前一頁下一頁休息休息第五十六頁,共一百八十五頁,編輯于2023年,星期四§2.3組合類第二章類和對象的定義第五十七頁,共一百八十五頁,編輯于2023年,星期四§2.3組合類類中的成員數(shù)據(jù)是另一個(gè)類的對象時(shí)稱此類為組合類必須用已有對象為組合類中的對象成員賦值使用對象成員時(shí)因其在類外,要受訪問權(quán)限控制類的組合概念第五十八頁,共一百八十五頁,編輯于2023年,星期四§2.3組合類classPoint //普通類{public: voidInit(intxx=0,intyy=0)//設(shè)置函數(shù) { X=xx;Y=yy; } intGetX(){returnX;}//取X的值 intGetY(){returnY;}//取Y的值private: intX,Y;};類的組合舉例第五十九頁,共一百八十五頁,編輯于2023年,星期四classDistance//組合類

{public:

voidSet(Pointxp1,Pointxp2);//設(shè)置函數(shù) doubleGetDis();//求距離private:

Pointp1,p2; //Point類對象,兩端點(diǎn)坐標(biāo) doubledist; //兩點(diǎn)間距離};下一頁前一頁休息休息形參是其他類對象第六十頁,共一百八十五頁,編輯于2023年,星期四voidDistance::Set(Pointxp1,Pointxp2){ p1=xp1;//同類對象可直接賦值 p2=xp2;//形參對象賦值給成員對象} doubleDistance::GetDis(){ doublex,y; x=double(p1.GetX()-p2.GetX()); y=double(p1.GetY()-p2.GetY());

dist=sqrt(x*x+y*y); returndist;}下一頁前一頁休息休息現(xiàn)在位置是Point類外,須通過對象名使用成員,且只能使用公有成員函數(shù)本類成員直接使用第六十一頁,共一百八十五頁,編輯于2023年,星期四voidmain()//no2.3-1.cpp{

Pointmyp1,myp2; myp1.Init(1,1);myp2.Init(4,5);

//為Point類對象賦值

Distancemyd; myd.Set(myp1,myp2);//為Distance類對象賦值 cout<<"Thedistanceis:"; cout<<myd.GetDis()<<endl;}下一頁前一頁休息休息結(jié)果為:Thedistanceis:5第六十二頁,共一百八十五頁,編輯于2023年,星期四§2.3組合類類應(yīng)該先定義,后使用上例:如Point類定義在Distance類之后,程序?qū)⒊鲥e(cuò)如果需要在某個(gè)類的定義之前,引用該類,則應(yīng)進(jìn)行前向引用聲明聲明格式:

class類名;前向引用聲明只為程序引入一個(gè)標(biāo)識符,但類具體定義在其它地方前向引用聲明第六十三頁,共一百八十五頁,編輯于2023年,星期四§2.3組合類classB;//前向引用聲明classA{public:voidf(Bb);//引用B類對象};classB{public:voidg(Aa);//引用A類對象};前向引用聲明舉例第六十四頁,共一百八十五頁,編輯于2023年,星期四§2.4構(gòu)造函數(shù)第二章類和對象的定義第六十五頁,共一百八十五頁,編輯于2023年,星期四§2.4構(gòu)造函數(shù)構(gòu)造函數(shù)是一種特殊的類成員函數(shù)構(gòu)造函數(shù)的作用初始化對象中的數(shù)據(jù)成員特點(diǎn):構(gòu)造函數(shù)名必須與類名相同。構(gòu)造函數(shù)無返回值且不必用類型名void構(gòu)造函數(shù)概念第六十六頁,共一百八十五頁,編輯于2023年,星期四構(gòu)造函數(shù)舉例#include<iostream.h>//no2.4-1.cppclassPoint{public: Point(inta,intb)//構(gòu)造函數(shù),給對象賦初值

{X=a;Y=b;} voidInit(intinitX,intinitY)

//賦值函數(shù),修改對象值{X=initX;Y=initY;} intGetX(){returnX;}//取X值函數(shù) intGetY(){returnY;}//取Y值函數(shù)private:intX,Y;};構(gòu)造函數(shù)舉例函數(shù)名與類名相同且無類型名第六十七頁,共一百八十五頁,編輯于2023年,星期四§2.4構(gòu)造函數(shù)對象定義另一格式:

類名對象名(實(shí)參表)例:PointP1(1,2)

定義對象P1,且為其兩個(gè)數(shù)據(jù)成員X、Y分別賦初值1和2構(gòu)造函數(shù)的調(diào)用方法:創(chuàng)建對象時(shí)用戶給定實(shí)參,由系統(tǒng)自動調(diào)用構(gòu)造函數(shù)的調(diào)用第六十八頁,共一百八十五頁,編輯于2023年,星期四構(gòu)造函數(shù)舉例intmain(){

PointA(1,2);

//定義對象A,同時(shí)系統(tǒng)自動調(diào)用構(gòu)造函數(shù)為A賦初值 cout<<A.GetX()<<'\t'<<A.GetY()<<endl; return0;}構(gòu)造函數(shù)舉例執(zhí)行結(jié)果:12第六十九頁,共一百八十五頁,編輯于2023年,星期四§2.4構(gòu)造函數(shù)構(gòu)造函數(shù)可以有參亦可無參上例:如X、Y默認(rèn)初值為0,則構(gòu)造函數(shù)可為: Point(){X=Y=0;}對應(yīng)對象定義:

PointA注意:不可帶實(shí)參,也不必帶括號構(gòu)造函數(shù)特性第七十頁,共一百八十五頁,編輯于2023年,星期四§2.4構(gòu)造函數(shù)程序可不定義構(gòu)造函數(shù),此時(shí)系統(tǒng)自動產(chǎn)生一個(gè)默認(rèn)的構(gòu)造函數(shù),為無參空函數(shù)。上例,系統(tǒng)自動定義的構(gòu)造函數(shù)為:

Point(){}構(gòu)造函數(shù)允許為內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶默認(rèn)形參值的函數(shù)。構(gòu)造函數(shù)特性第七十一頁,共一百八十五頁,編輯于2023年,星期四實(shí)例:定義一個(gè)時(shí)間類,并測試//no2.4-2.cppclassTime{public:

Time();//重載構(gòu)造函數(shù) Time(intNewH,intNewM,intNewS); voidSetTime(intNewH,intNewM,intNewS);//設(shè)置時(shí)間 voidShowTime();//顯示時(shí)間private: intHour,Minute,Second;};重載構(gòu)造函數(shù)舉例§2.4構(gòu)造函數(shù)第七十二頁,共一百八十五頁,編輯于2023年,星期四//構(gòu)造函數(shù)的實(shí)現(xiàn):Time::Time(){ Hour=0;Minute=0;Second=0;}Time::Time(intNewH,intNewM,intNewS){ Hour=NewH;Minute=NewM; Second=NewS;}Time::voidSetTime(intNewH,intNewM,intNewS){Hour=NewH;Minute=NewM;Second=NewS;}Time::voidShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}休息前一頁下一頁第七十三頁,共一百八十五頁,編輯于2023年,星期四//建立對象時(shí)構(gòu)造函數(shù)的作用:voidmain(){

Timeb;//調(diào)用無參構(gòu)造函數(shù)

Timec(12,30,0);//調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參b.ShowTime(); c.ShowTime();}結(jié)果為:0:0:012:30:0休息前一頁下一頁第七十四頁,共一百八十五頁,編輯于2023年,星期四§2.4構(gòu)造函數(shù)構(gòu)造函數(shù)的另一種形式構(gòu)造函數(shù)還可用在函數(shù)外直接為其成員初始化的方法為成員賦初值成員初始化格式:

成員名1(形參1),成員名2(形參2)……構(gòu)造函數(shù)另一格式:

類名(形參表):

成員初始化

{}例:上例Time類無參構(gòu)造函數(shù)可寫為:

Time():Hour(0),Minute(0),Second(0){}構(gòu)造函數(shù)特性第七十五頁,共一百八十五頁,編輯于2023年,星期四實(shí)例:定義時(shí)間類,并測試//no2.4-2A.cppclassTime{public: Time(intNewH=0,intNewM=0,intNewS=0); voidSetTime(intNewH,intNewM,intNewS);//設(shè)置時(shí)間 voidShowTime();//顯示時(shí)間private: intHour,Minute,Second;};帶默認(rèn)值構(gòu)造函數(shù)舉例§2.4構(gòu)造函數(shù)第七十六頁,共一百八十五頁,編輯于2023年,星期四//構(gòu)造函數(shù)的實(shí)現(xiàn):Time::Time(intNewH,intNewM,intNewS){ Hour=NewH;Minute=NewM;Second=NewS;}Time::voidSetTime(intNewH,intNewM,intNewS){Hour=NewH;Minute=NewM;Second=NewS;}Time::voidShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}休息前一頁下一頁第七十七頁,共一百八十五頁,編輯于2023年,星期四//建立對象時(shí)構(gòu)造函數(shù)的作用:voidmain(){

Timeb;//構(gòu)造函數(shù)中使用默認(rèn)值

Timec(12,30,0);//構(gòu)造函數(shù)中使用形參初始化b.ShowTime(); c.ShowTime();}結(jié)果為:0:0:012:30:0休息前一頁下一頁第七十八頁,共一百八十五頁,編輯于2023年,星期四classsample//no2.4-3.cpp{ inti;

public: sample(){i=0;}

sample(intx=1){i=x;} voiddisplay(){cout<<i<<endl;}};voidmain(){ sampleB(5),A; A.display(); B.display();}構(gòu)造函數(shù)的二義性會引起二義性§2.4構(gòu)造函數(shù)第七十九頁,共一百八十五頁,編輯于2023年,星期四§2.4構(gòu)造函數(shù)二義性解決方法刪除無參構(gòu)造函數(shù)重載定義一個(gè)無參構(gòu)造函數(shù)和一個(gè)不帶默認(rèn)值的構(gòu)造函數(shù)如上例定義成:sample(){i=0;}sample(intx){i=x;}注意:有時(shí)將無參或帶默認(rèn)值的構(gòu)造函數(shù)亦稱為默認(rèn)構(gòu)造函數(shù)第八十頁,共一百八十五頁,編輯于2023年,星期四§2.5析構(gòu)函數(shù)第二章類和對象的定義第八十一頁,共一百八十五頁,編輯于2023年,星期四§2.5析構(gòu)函數(shù)析構(gòu)函數(shù)亦為特殊的成員函數(shù)函數(shù)格式:~類名()

{函數(shù)體}特點(diǎn):無返回值,亦不必寫void無參,亦不可進(jìn)行重載功能:完成對象被刪除前的一些清理工作析構(gòu)函數(shù)概念第八十二頁,共一百八十五頁,編輯于2023年,星期四§2.5析構(gòu)函數(shù)#include<iostream.h>//no2.5-1.cppclassPoint{public:Point(intinitX,intinitY); ~Point(); intGetX(){returnX;} intGetY(){returnY;}private:intX,Y;};析構(gòu)函數(shù)舉例第八十三頁,共一百八十五頁,編輯于2023年,星期四§2.5析構(gòu)函數(shù)Point::Point(intinitX=0,intinitY=0){ X=initX;Y=initY; cout<<"調(diào)用了構(gòu)造函數(shù)"<<endl;}Point::~Point()

{ cout<<"調(diào)用了析構(gòu)函數(shù)\n"; }析構(gòu)函數(shù)舉例第八十四頁,共一百八十五頁,編輯于2023年,星期四§2.5析構(gòu)函數(shù)intmain(){

PointA(1,2); cout<<A.GetX()<<'\t'<<A.GetY()<<endl; return0;}析構(gòu)函數(shù)舉例執(zhí)行結(jié)果:調(diào)用了構(gòu)造函數(shù)12調(diào)用了析構(gòu)函數(shù)第八十五頁,共一百八十五頁,編輯于2023年,星期四§2.5析構(gòu)函數(shù)析構(gòu)調(diào)用方式:在對象的生存期結(jié)束的時(shí)刻由系統(tǒng)自動調(diào)用,然后再釋放此對象所屬的空間析構(gòu)函數(shù)是對象生命結(jié)束前最后一個(gè)執(zhí)行的函數(shù)如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個(gè)缺省的空析構(gòu)函數(shù)當(dāng)成員函數(shù)中有動態(tài)創(chuàng)建內(nèi)存操作時(shí),必須定義析構(gòu)函數(shù)在對象生命結(jié)束前釋放空間析構(gòu)函數(shù)特點(diǎn)第八十六頁,共一百八十五頁,編輯于2023年,星期四必須編寫析構(gòu)函數(shù)實(shí)例(no2.5-2.cpp

)#include<iostream.h>#include<iomanip.h>classArray {public: Array(floatdata[],intn1); voidprocess(); voidshow(); ~Array();private: intn; float*a; floataverage;};析構(gòu)函數(shù)舉例成員為指針,準(zhǔn)備進(jìn)行動態(tài)內(nèi)存分配前一頁下一頁第八十七頁,共一百八十五頁,編輯于2023年,星期四§2.5析構(gòu)函數(shù)Array::Array(floatdata[],intn1)//構(gòu)造函數(shù){ n=n1;

a=newfloat[n]; for(inti=0;i<n;i++)a[i]=data[i];}Array::~Array()//析構(gòu)函數(shù){

delete[]a;}析構(gòu)函數(shù)舉例動態(tài)開辟了內(nèi)存并用成員a存放其地址必須在對象結(jié)束前釋放動態(tài)內(nèi)存第八十八頁,共一百八十五頁,編輯于2023年,星期四§2.5析構(gòu)函數(shù)voidArray::process()//求數(shù)組平均值函數(shù){ average=0.0; for(inti=1;i<n;i++) average+=a[i]; average/=n;}voidArray::show()//輸出函數(shù){ cout<<"數(shù)組元素:"<<endl; for(inti=0;i<n;i++) { cout<<setw(4)<<a[i]; if((i+1)%5==0)cout<<endl; } cout<<"數(shù)組元素平均值為:"<<average<<endl;}析構(gòu)函數(shù)舉例第八十九頁,共一百八十五頁,編輯于2023年,星期四§2.5析構(gòu)函數(shù)voidmain() { Arrayv(data,n1);//定義對象并調(diào)用構(gòu)造函數(shù)初始化 intn1,i; floatdata[20];//普通數(shù)組大小必須為常量 cout<<"請輸入數(shù)組元素個(gè)數(shù):"<<endl; cin>>n1; cout<<"請輸入數(shù)組:"<<endl; for(i=0;i<n1;i++) cin>>data[i]; cess(); v.show();}析構(gòu)函數(shù)舉例第九十頁,共一百八十五頁,編輯于2023年,星期四§2.6復(fù)制構(gòu)造函數(shù)第二章類和對象的定義第九十一頁,共一百八十五頁,編輯于2023年,星期四§2.6復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)又稱拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用。class類名{public:類名(形參);//構(gòu)造函數(shù)類名(類名&對象名);//復(fù)制構(gòu)造函數(shù)...};類名::類名(類名&對象名)//復(fù)制構(gòu)造函數(shù)的實(shí)現(xiàn){函數(shù)體}復(fù)制構(gòu)造函數(shù)第九十二頁,共一百八十五頁,編輯于2023年,星期四§2.6復(fù)制構(gòu)造函數(shù)classPoint//no2.6-1.cpp{public:Point(intxx=0,intyy=0);//構(gòu)造函數(shù) Point(Point&p);//復(fù)制構(gòu)造函數(shù)intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};復(fù)制構(gòu)造函數(shù)舉例第九十三頁,共一百八十五頁,編輯于2023年,星期四Point::Point(intxx=0,intyy=0)//構(gòu)造函數(shù)實(shí)現(xiàn){ //直接為本對象成員賦值 X=xx;Y=yy; cout<<"構(gòu)造函數(shù)被調(diào)用"<<endl;}Point::Point(Point&p)//復(fù)制構(gòu)造函數(shù){

//用形參對象的成員值為本對象成員賦值X=p.X;Y=p.Y;cout<<"復(fù)制構(gòu)造函數(shù)被調(diào)用"<<endl;}下一頁休息休息前一頁第九十四頁,共一百八十五頁,編輯于2023年,星期四復(fù)制構(gòu)造函數(shù)的調(diào)用定義對象時(shí)到底調(diào)用構(gòu)造函數(shù)還是復(fù)制構(gòu)造函數(shù)由系統(tǒng)根據(jù)情況決定一般以下三種情況下系統(tǒng)自動調(diào)復(fù)制構(gòu)造函數(shù)用對象初始化另一對象形參是對象時(shí)對象型函數(shù)復(fù)制構(gòu)造函數(shù)第九十五頁,共一百八十五頁,編輯于2023年,星期四復(fù)制構(gòu)造函數(shù)的調(diào)用當(dāng)用類的一個(gè)對象去初始化該類的另一個(gè)對象時(shí)系統(tǒng)自動調(diào)用它實(shí)現(xiàn)拷貝賦值。 voidmain(void){PointA(1,2);//構(gòu)造函數(shù)被調(diào)用PointB(A);

//復(fù)制構(gòu)造函數(shù)被調(diào)用cout<<"A:x="<<A.GetX()<<"A:y="<<A.GetY()<<endl;cout<<"B:x="<<B.GetX()<<"B:y="<<B.GetY()<<endl;}復(fù)制構(gòu)造函數(shù)第九十六頁,共一百八十五頁,編輯于2023年,星期四復(fù)制構(gòu)造函數(shù)的調(diào)用若函數(shù)的形參為對象,調(diào)用函數(shù)時(shí),實(shí)參要給形參傳值,需要系統(tǒng)自動調(diào)用復(fù)制構(gòu)造函數(shù)。例如:voidfun1(Pointp)//no2.6-1A.cpp{cout<<p.GetX()<<endl;}voidmain(){PointA(1,2);fun1(A);//對象A作實(shí)參與形參對象p虛實(shí)結(jié)合時(shí)調(diào)用復(fù)制構(gòu)造函數(shù)}復(fù)制構(gòu)造函數(shù)第九十七頁,共一百八十五頁,編輯于2023年,星期四復(fù)制構(gòu)造函數(shù)的調(diào)用當(dāng)函數(shù)的返回值是對象時(shí),由于函數(shù)內(nèi)部對象即將失去存儲空間,故系統(tǒng)定義一個(gè)臨時(shí)無名對象以記下要返回的值,并自動調(diào)用復(fù)制構(gòu)造函數(shù)為此對象賦初值。例如:Pointfun2()//no2.6-1B.cpp{PointA(1,2);returnA;//調(diào)用復(fù)制構(gòu)造函數(shù)}voidmain(){PointB;B=fun2();}復(fù)制構(gòu)造函數(shù)第九十八頁,共一百八十五頁,編輯于2023年,星期四§2.6復(fù)制構(gòu)造函數(shù)如果程序沒有編寫復(fù)制構(gòu)造函數(shù),編譯器將自動生成默認(rèn)復(fù)制構(gòu)造函數(shù)。默認(rèn)復(fù)制構(gòu)造函數(shù)的功能:用作為初始值的對象的每個(gè)數(shù)據(jù)成員的值,初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員復(fù)制構(gòu)造函數(shù)的特點(diǎn)第九十九頁,共一百八十五頁,編輯于2023年,星期四§2.7組合類的構(gòu)造函數(shù)第二章類和對象的定義第一百頁,共一百八十五頁,編輯于2023年,星期四§2.7組合類的構(gòu)造函數(shù)原則:不僅要對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員初始化聲明形式:類名::類名(對象成員所需的形參,本類成員形參)

:對象1(參數(shù)),對象2(參數(shù)),......{本類初始化}類組合的構(gòu)造函數(shù)第一百零一頁,共一百八十五頁,編輯于2023年,星期四classPoint {public: Point(intxx=0,intyy=0) { X=xx;Y=yy; } Point(Point&p);//函數(shù)實(shí)現(xiàn)略 intGetX(){returnX;} intGetY(){returnY;}private: intX,Y;};組合類的構(gòu)造函數(shù)類的組合舉例第一百零二頁,共一百八十五頁,編輯于2023年,星期四classDistance//類的組合

{public: Distance(Pointxp1,Pointxp2); doubleGetDis(){returndist;}private:

Pointp1,p2; //Point類的對象p1,p2 doubledist; };組合類的構(gòu)造函數(shù)第一百零三頁,共一百八十五頁,編輯于2023年,星期四Distance::Distance(Pointxp1,Pointxp2):p1(xp1),p2(xp2)//對對象成員進(jìn)行初始化{ doublex,y;cout<<"Distance構(gòu)造函數(shù)被調(diào)用"<<endl; x=p1.GetX()-p2.GetX(); y=p1.GetY()-p2.GetY();

dist=sqrt(x*x+y*y);}組合類的構(gòu)造函數(shù)第一百零四頁,共一百八十五頁,編輯于2023年,星期四voidmain()//no2.7-1.cpp{

Pointmyp1(1,1),myp2(4,5);

Distancemyd(myp1,myp2); cout<<"Thedistanceis:"; cout<<myd.GetDis()<<endl;}//本函數(shù)共定義了三個(gè)對象組合類的構(gòu)造函數(shù)第一百零五頁,共一百八十五頁,編輯于2023年,星期四結(jié)果為:Point構(gòu)造函數(shù)被調(diào)用Point構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Distance構(gòu)造函數(shù)被調(diào)用Thedistanceis:5下一頁前一頁休息休息第一百零六頁,共一百八十五頁,編輯于2023年,星期四組合類的構(gòu)造函數(shù)構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)(按內(nèi)嵌時(shí)的聲明順序,先聲明者先構(gòu)造)。然后調(diào)用本類的構(gòu)造函數(shù)。若調(diào)用缺省構(gòu)造函數(shù)(即無形參的),則內(nèi)嵌對象的初始化也將調(diào)用相應(yīng)的缺省構(gòu)造函數(shù)。析構(gòu)函數(shù)也是同樣處理,只是調(diào)用順序正好相反類組合的構(gòu)造函數(shù)第一百零七頁,共一百八十五頁,編輯于2023年,星期四結(jié)果分析:Point構(gòu)造函數(shù)被調(diào)用//Point類對象myp1初始化Point構(gòu)造函數(shù)被調(diào)用//Point類對象myp2初始化Point拷貝構(gòu)造函數(shù)被調(diào)用//虛實(shí)結(jié)合Point拷貝構(gòu)造函數(shù)被調(diào)用//虛實(shí)結(jié)合Point拷貝構(gòu)造函數(shù)被調(diào)用//構(gòu)造函數(shù)中用xp1初始化p1Point拷貝構(gòu)造函數(shù)被調(diào)用//構(gòu)造函數(shù)中用xp2初始化p2Distance構(gòu)造函數(shù)被調(diào)用Thedistanceis:5下一頁前一頁休息休息第一百零八頁,共一百八十五頁,編輯于2023年,星期四加析構(gòu)函數(shù)的結(jié)果為://no2.7-1A.cppPoint構(gòu)造函數(shù)被調(diào)用Point構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Distance構(gòu)造函數(shù)被調(diào)用Thedistanceis:5Distance析構(gòu)函數(shù)被調(diào)用//撤消Distance類對象mydPoint析構(gòu)函數(shù)被調(diào)用//撤消Distance類對象成員p1Point析構(gòu)函數(shù)被調(diào)用//撤消Distance類對象成員p2Point析構(gòu)函數(shù)被調(diào)用//撤消Point類對象myp1Point析構(gòu)函數(shù)被調(diào)用//撤消Point類對象myp2下一頁前一頁休息休息第一百零九頁,共一百八十五頁,編輯于2023年,星期四§2.8用const保護(hù)數(shù)據(jù)第二章類和對象的定義第一百一十頁,共一百八十五頁,編輯于2023年,星期四用const保護(hù)數(shù)據(jù)為確保數(shù)據(jù)能在一定范圍內(nèi)共享,又不被任意修改,C++允許使用const關(guān)鍵字來修飾有關(guān)數(shù)據(jù)定義,使這些數(shù)據(jù)在本程序中作常量處理,不能改變其值使用const的常見情況常對象成員常對象常引用第一百一十一頁,共一百八十五頁,編輯于2023年,星期四常對象成員常對象成員定義類時(shí)在部分成員定義中加入關(guān)鍵字const,此成員即成為常對象成員分類:常數(shù)據(jù)成員常成員函數(shù)用const保護(hù)數(shù)據(jù)第一百一十二頁,共一百八十五頁,編輯于2023年,星期四常數(shù)據(jù)成員常數(shù)據(jù)成員定義格式:

const類型名數(shù)據(jù)成員名特點(diǎn):不能在程序中改變常數(shù)據(jù)成員的值常數(shù)據(jù)成員只能通過構(gòu)造函數(shù)的參數(shù)初始化表進(jìn)行初始化用const保護(hù)數(shù)據(jù)第一百一十三頁,共一百八十五頁,編輯于2023年,星期四常數(shù)據(jù)成員使用實(shí)例classCircle{private: doubleradius; //半徑

constdoublePI; //圓周率,常數(shù)據(jù)成員public: Circle(doubler)

:PI(3.1415926)

//構(gòu)造函數(shù) {radius=r;} voidSetRadius(doubler){radius=r;}//設(shè)置半徑 voidShow() //輸出信息 { cout<<"半徑:"<<radius<<"\t"; cout<<"面積:"<<PI*radius*radius<<endl; }};用const保護(hù)數(shù)據(jù)常數(shù)據(jù)成員不通過形參賦值參數(shù)初始化為常數(shù)據(jù)成員賦初值第一百一十四頁,共一百八十五頁,編輯于2023年,星期四常數(shù)據(jù)成員使用實(shí)例intmain() //no2.8-1.cpp

{ Circlec(1); //定義半徑為1的圓 c.Show(); c.SetRadius(2);//設(shè)置圓半徑為2 c.Show(); system("PAUSE"); return0;}用const保護(hù)數(shù)據(jù)運(yùn)行結(jié)果:半徑:1面積:3.14159半徑:2面積:12.5664請按任意鍵繼續(xù)...

第一百一十五頁,共一百八十五頁,編輯于2023年,星期四常成員函數(shù)定義格式:類型名函數(shù)名(形參表)const特點(diǎn):只能引用本類中的所有數(shù)據(jù)成員,但不能修改它們函數(shù)聲明和函數(shù)定義處都要加const關(guān)鍵字,調(diào)用時(shí)不加用const保護(hù)數(shù)據(jù)第一百一十六頁,共一百八十五頁,編輯于2023年,星期四classCircle{private: doubleradius; //半徑

constdoublePI; //圓周率,常數(shù)據(jù)成員public: Circle(doubler)

:PI(3.1415926

)//構(gòu)造函數(shù) {radius=r;} voidSetRadius(doubler)//設(shè)置半徑 {radius=r;}

doubleGetArea()

const

//返回面積常成員函數(shù) {returnPI*radius*radius;}

voidShow()const; //輸出信息常成員函數(shù)};常成員函數(shù)使用實(shí)例前一頁下一頁第一百一十七頁,共一百八十五頁,編輯于2023年,星期四voidCircle::Show()const//輸出信息常成員函數(shù){ cout<<"半徑:"<<radius<<"\t"; cout<<"面積:"<<GetArea()<<endl;}intmain() //no2.8-1A.cpp

{ Circlec(1); //定義半徑為

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論