版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第四章類和對(duì)象本章重點(diǎn)內(nèi)容:1、c++中定義類的方法2、對(duì)象的建立和使用方法3、構(gòu)造函數(shù)和析構(gòu)函數(shù)邱粉寫裙整蕊讓謝瑤哉探琵膏劉弊恿飽鳥葛端饅譬瀉竟敝杠柜凹即垃箱該c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.1類及其實(shí)例化一、定義類(1、聲明類)類是一種用戶自定義的數(shù)據(jù)類型,是對(duì)一組性質(zhì)相同的對(duì)象的程序描述。和其他數(shù)據(jù)類型不同的是,組成這種類型的不僅可以有數(shù)據(jù),而且可以有對(duì)數(shù)據(jù)進(jìn)行操作的函數(shù),它們分別叫做
和
。數(shù)據(jù)成員成員函數(shù)類的聲明以關(guān)鍵字
開始。其聲明的一般形式:classclass類名{數(shù)據(jù)成員和成員函數(shù)};private:私有數(shù)據(jù)和函數(shù)public:公有數(shù)據(jù)和函數(shù)protected:保護(hù)數(shù)據(jù)和函數(shù)訪問權(quán)限:私有的公有的保護(hù)的privatepublicprotected類體分號(hào)作為類聲明語句的結(jié)束標(biāo)志。注:如果沒有使用關(guān)鍵字,則所有成員默認(rèn)聲明為
權(quán)限。private澈獻(xiàn)寅猖煙疇褪而及彝靖潮暗濘隸疏壇壩碼擴(kuò)牡想畏企蔽雄益幫鈍棲坤臍c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象類的一般定義形式:class類名{private:私有數(shù)據(jù)和函數(shù)public:公有數(shù)據(jù)和函數(shù)protected:保護(hù)數(shù)據(jù)和函數(shù)};注:(1)對(duì)于數(shù)據(jù)成員可以像聲明變量一樣來聲明它。(3)成員函數(shù)可以訪問類中的任何成員(包括數(shù)據(jù)成員和成員函數(shù)),而無需將其聲明為參數(shù),惟一的限制條件是在使用一個(gè)成員之前必須聲明它。(2)對(duì)于成員函數(shù),一般是使用函數(shù)原型來聲明它,而把函數(shù)的具體實(shí)現(xiàn)在類外來定義(尤其是對(duì)于函數(shù)體語句比較多的成員函數(shù))。澄檬見容墳爭(zhēng)蛾縛行商恤粒鹿哀蝕登昨奔絕乒道翹粟沁櫻凌纂凍蓖駐終鑄c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象例題:根據(jù)下圖定義一個(gè)描述點(diǎn)的類PointPointx:floaty:floatDisplay:voidSetxy:voidGetx:floatGety:floatclassPoint{}floatx,y;voiddisplay();public:voidSetxy(floata,floatb);floatGetx();floatGety();;峽燦淋亂丸之陸貍瘦柞攻育繁攫龜飾傘笆盯縷凹熒務(wù)框擱株臂奇?zhèn)z靖黑畸c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象2、定義成員函數(shù)類中聲明的成員函數(shù)用來對(duì)數(shù)據(jù)成員進(jìn)行操作,還必須在程序中實(shí)現(xiàn)這些成員函數(shù)。classPoint{floatx,y;public:voiddisplay();voidSetxy(floata,floatb);floatGetx();floatGety();};定義成員函數(shù)的一般形式:返回類型類名::成員函數(shù)名(參數(shù)列表){函數(shù)體}“::”是作用域運(yùn)算符,表明其后的成員函數(shù)屬于某個(gè)特定的類。
卵嶄析燭彰紀(jì)鍵揀肆份文臘物劊昭鉀舉氨世渣滄洶泥纓懂沮靠輔酬明獅勻c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象例題:定義Point類的成員函數(shù)classPoint{floatx,y;public:voidDisplay();voidSetxy(floata,floatb);floatGetx();floatGety();};顯示坐標(biāo)x和y的值voidPoint::display(){cout<<"("<<x<<","<<y<<")"<<endl;}voidPoint::Setxy(floata,floatb){x=a;y=b;}floatPoint::Gety(){returny;}floatPoint::Getx(){returnx;}設(shè)置坐標(biāo)x和y的值設(shè)置坐標(biāo)x和y的值分別返回坐標(biāo)x和y的值也可以使用關(guān)鍵字
將成員函數(shù)說明為內(nèi)聯(lián)函數(shù)。inlineinlinevoidPoint::display()蹭粹之妨鏈遣彭嫂氈挽垛弗盔丑引鍵是澎瞥礎(chǔ)幀釩亭嘔蹬滋精耗魔激步檬c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象classPoint{floatx,y;public:voidDisplay();voidSetxy(floata,floatb);
floatGetx();
floatGety();};voidPoint::Display(){cout<<"("<<x<<","<<y<<")"<<endl;}voidPoint::Setxy(floata,floatb){x=a;y=b;}floatPoint::Getx(){returnx;}floatPoint::Gety(){returny;}注:(1)對(duì)于簡(jiǎn)單的成員函數(shù)也可以直接在類體內(nèi)給出定義。{returnx;}{returny;}(2)在類體內(nèi)定義的成員函數(shù),默認(rèn)為內(nèi)聯(lián)函數(shù)。咱女吼逆沖爺磨祭快吞絆仍當(dāng)恍應(yīng)轍膩韓吶凹曳儡韓宜吸曬皮倆褒磚濘堯c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象3、數(shù)據(jù)成員的賦值類是一種數(shù)據(jù)類型,系統(tǒng)不會(huì)給類分配存儲(chǔ)空間,所以在定義一個(gè)類的時(shí)候,不能在類體內(nèi)給數(shù)據(jù)成員賦值。例如:下面的方法是錯(cuò)誤的:classPoint{floatx=2.5,y=6.9;public:…………};錯(cuò)誤:不能在類體內(nèi)給數(shù)據(jù)成員賦值銑申洗孝咸氰傀護(hù)揀熙棱賜槐從盔宛科姚簍試鈍漏拎刷他香蝴遷嘲泌椿神c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象只有在定義了類的對(duì)象后,才能給對(duì)象的數(shù)據(jù)成員賦值。如果在產(chǎn)生對(duì)象時(shí)就使對(duì)象的數(shù)據(jù)成員具有指定值,稱為對(duì)象的初始化。(通過
來實(shí)現(xiàn))也可以在定義了對(duì)象之后,通過調(diào)用成員函數(shù)給數(shù)據(jù)成員賦值。(通過
來實(shí)現(xiàn))
構(gòu)造函數(shù)成員函數(shù)替傀檔貧洞塢浮擺茅焉擔(dān)僑虛紙鉛硫鬃俱燴油吭紐疙藥刁怠鏈題爾訪漢色c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象二、對(duì)象的定義一旦聲明了一個(gè)類,就可以用它作為數(shù)據(jù)類型來定義類的對(duì)象(簡(jiǎn)稱為對(duì)象)。
定義對(duì)象的格式:類型對(duì)象名表可以是一般的對(duì)象名,指針變量名(即對(duì)象指針)引用名(即對(duì)象引用)對(duì)象數(shù)組名如:Pointa;Point*pa;Point&ra=a;Pointb[5];以上都是的定義正確形式。昔腺刪緘該辟靡羹澤朵隕離臟評(píng)男斧勻豢骯溜坡熄東杠未旅傣房隆他錫匯c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象三、使用類的對(duì)象定義了類的對(duì)象之后,就可以使用對(duì)象的數(shù)據(jù)成員和成員函數(shù)了。對(duì)象和引用都是用運(yùn)算符“.”訪問對(duì)象成員,指針則使用“->”運(yùn)算符。跌帥劊蹤量墩衫伸饅羌別啊果堯莆匙敞斬鐮框詭貞蛙誰爵妙例始鍺押丙產(chǎn)c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象對(duì)象的數(shù)據(jù)成員訪問方式:對(duì)象名.數(shù)據(jù)成員名或者引用名.數(shù)據(jù)成員名或者對(duì)象指針名->數(shù)據(jù)成員名對(duì)象的成員函數(shù)訪問方式:對(duì)象名.成員函數(shù)名(參數(shù)列表)或者引用名.成員函數(shù)名(參數(shù)列表)或者對(duì)象指針名->成員函數(shù)名(參數(shù)列表)請(qǐng)仔細(xì)閱讀課本:P72(1)(2)(3)(4)及表4.1賀彌科坷陪駁緣賀誨舍追丟擂肩畫壓錫虐憚望寞燴允褲欄諄寂幀瑯墊馳逼c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象例題:classPoint{floatx,y;public:voidDisplay();voidSetxy(floata,floatb);floatGetx();floatGety();};voidPoint::Display(){cout<<x<<","<<y<<endl;}voidPoint::Setxy(floata,floatb){x=a;y=b;}floatPoint::Getx(){returnx;}floatPoint::Gety(){returny;}voidmain(){Pointa;
a.Setxy(3.5,5.8);
a.Display();Point&ra=a;cout<<ra.Getx()<<","<<ra.Gety()<<endl;Point*pa=&a;
pa->Setxy(3.6,9.3);
pa->Display();}異饅拴憐縱訛滯伏嘿餞滌彰耙丸筑音歹歇茲翱蓄駕脯冰副孿虎豪藥轅結(jié)貳c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象練習(xí):分析以下程序結(jié)果(lt4_3.cpp)#include<iostream>usingnamespacestd;classPoint{ intx,y;public: voidSetxy(inta,intb) {x=a;y=b;} voidMove(inta,intb) {x=x+a;y=y+b;} voidDisplay() {cout<<x<<","<<y<<endl;} intGetx(){returnx;} intGety(){returny;}};voidprint(Point*a){a->Display();}voidprint(Point&a){a.Display();}voidmain(){Pointa,b,*p;Point&ra=a;a.Setxy(25,55);b=a;//同類的對(duì)象可以相互賦值p=&b;p->Setxy(112,115);print(p);p->Display();ra.Move(-80,23);print(a);print(&a);}謝挺掃鉆恰咕辜鄂渺旗拿簽晌劊膨賺山養(yǎng)傀滑份約銷醋閘嗽磁檬溯臘勛諱c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象四、數(shù)據(jù)封裝C++通過類實(shí)現(xiàn)封裝,即通過指定個(gè)成員的訪問權(quán)限來實(shí)現(xiàn)。訪問權(quán)限:private、public、protected所謂封裝就是:通過對(duì)象可以在類外使用公有成員,通過對(duì)象不可以在類外使用私有成員,在類內(nèi)可以直接使用所有成員成員函數(shù)是對(duì)象具有的功能,我們說對(duì)象間利用公有成員函數(shù)進(jìn)行通信。公用成員函數(shù)是對(duì)象的接口。豹束露南氖潤兩堅(jiān)哭找飛骯信規(guī)騙駭敬橫槐淬牟編烏茁芥銑惰咆城揣族悅c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.1.3數(shù)據(jù)封裝所謂封裝就是:通過對(duì)象可以在類外使用公有成員,通過對(duì)象不可以在類外使用私有成員,在類內(nèi)可以直接使用所有成員C++對(duì)對(duì)象的數(shù)據(jù)成員和成員函數(shù)的訪問控制是通過訪問權(quán)限來限制的。訪問權(quán)限:private、public、protected成員函數(shù)是對(duì)象具有的功能,我們說對(duì)象間利用公有成員函數(shù)進(jìn)行通信。公用成員函數(shù)是對(duì)象的接口。姥隱贊趴棠舜跟辛爍哥眩株腔聾府癢忽耀蔭玖戳斷哺寡瘩假鎮(zhèn)拍濃儡鋼醋c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象1.假定AA為一個(gè)類,a()為該類公有的函數(shù)成員,x為該類的一個(gè)對(duì)象,則訪問x對(duì)象中函數(shù)成員a()的格式為()A.x.aB.x.a()C.x->aD.x->a()2.下列訪問成員的方式哪個(gè)是正確的(
)A.對(duì)象名.對(duì)象成員名
B.對(duì)象指針名.對(duì)象成員名
C.對(duì)象名→對(duì)象成員名
D.類名→對(duì)象成員名
課程回顧AB3.類和其它數(shù)據(jù)類型不同的是,組成這種類型的不僅可以有數(shù)據(jù),還可以有對(duì)數(shù)據(jù)進(jìn)行操作的_______。函數(shù)砰戰(zhàn)斥妙域上彝涂擯衣蟹啄課臍齡翟棺只鑒燎疚苔攻魔京羌惕謂顯召典勘c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.類A有如下成員函數(shù)intA::fun(doublex){return(int)x/2;}intA::fun(intx){returnx*2;}設(shè)a為類A的對(duì)象,在主函數(shù)中有ints=a.fun(6.0)+a.fun(2),則執(zhí)行該語句后,s的值為________。7桐杭攀艾盟拙坯獨(dú)滋懶叼淹演描鉆狠匆集系碰程瞎穩(wěn)向摳奢護(hù)蟬弘賣嶄顛c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.2構(gòu)造函數(shù)(重點(diǎn)掌握)在剛定義類對(duì)象時(shí),其數(shù)據(jù)成員有時(shí)需要有初始值。但在類聲明體中不能在聲明時(shí)初始化數(shù)據(jù)成員,私有的數(shù)據(jù)成員也不能從類以外來訪問。怎么辦?classPoint{ intx,y;public: voidSetxy(inta,intb) {x=a;y=b;} voidMove(inta,intb) {x=x+a;y=y+b;} voidDisplay() {cout<<x<<","<<y<<endl;} intGetx(){returnx;} intGety(){returny;}};例如:intx=3,y=5;是錯(cuò)誤的形式例如:Pointa;a.x=3;a.y=5;是錯(cuò)誤的形式可以定義成員函數(shù)來實(shí)現(xiàn)對(duì)數(shù)據(jù)成員的賦值。在每次定義一個(gè)新對(duì)象之后調(diào)用一下該函數(shù),就可以完成對(duì)數(shù)據(jù)成員的賦值。例如:Pointa;a.Setxy(3,5);是正確的賦值形式但是這種方法既不方便也容易忘記,如果用戶不小心忘記了調(diào)用setxy來給對(duì)象賦值,那么結(jié)果有可能出錯(cuò)。C++提供了一個(gè)更好的方法:利用構(gòu)造函數(shù)來初始化對(duì)象的數(shù)據(jù)成員。墩母臂來歐啊靠么莉款鯨迂樞球播灣哼拇蟲藉街束鴕瘋增詩京藹束潑壩滴c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象一、默認(rèn)構(gòu)造函數(shù)當(dāng)沒有為一個(gè)類定義任何構(gòu)造函數(shù)的情況下,c++編譯器總要自動(dòng)建立一個(gè)不帶參數(shù)的、函數(shù)體為空的構(gòu)造函數(shù)。classPoint{ intx,y;public: voidSetxy(inta,intb) {x=a;y=b;} voidMove(inta,intb) {x=x+a;y=y+b;} voidDisplay() {cout<<x<<","<<y<<endl;} intGetx(){returnx;} intGety(){returny;}};C++編譯器為其產(chǎn)生給一個(gè)如下形式的默認(rèn)構(gòu)造函數(shù):Point::Point(){}一旦程序定義了自己的構(gòu)造函數(shù),系統(tǒng)就不再提供默認(rèn)構(gòu)造函數(shù)。募灣鴉崔泥藐嚨旬蔑寨扣景是虐餌天漣浪賢哲稀傾確梳橙硬渠臭罩踩旺迷c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象所以所有構(gòu)造函數(shù)之間是
關(guān)系。二、定義構(gòu)造函數(shù)構(gòu)造函數(shù)具有如下性質(zhì):(1)構(gòu)造函數(shù)的名字與類同名。(2)構(gòu)造函數(shù)盡管是一個(gè)函數(shù),但沒有任何類型,既不屬于返回值函數(shù)也不屬于void函數(shù)。(3)一個(gè)類可以有多個(gè)構(gòu)造函數(shù),而且,一個(gè)類的所有構(gòu)造函數(shù)名字都相同,但參數(shù)各不相同。(4)當(dāng)創(chuàng)建一個(gè)類對(duì)象時(shí),構(gòu)造函數(shù)自動(dòng)執(zhí)行。不能像其他函數(shù)那樣進(jìn)行調(diào)用。而且調(diào)用哪一個(gè)構(gòu)造函數(shù)取決于傳遞給它的參數(shù)類型。重載軸竟排盡泳灸鞭迫婉崇逞甘燦諾墾責(zé)膜亡憂碘攙緩射液稗梭益濾瞞貳耶饒c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象classPoint{intx,y;public:
Point(inta,intb){x=a;y=b;} voidSetxy(inta,intb); voidMove(inta,intb); voidDisplay(); intGetx(){returnx;} intGety(){returny;}};voidPoint::Setxy(inta,intb) {x=a;y=b;}
voidPoint::Move(inta,intb) {x=x+a;y=y+b;}voidPoint::Display() {cout<<x<<","<<y<<endl;}例2:若有Ponta;Error:noappropriatedefaultconstructoravailable.錯(cuò)誤例1:若有Ponta(5,9);正確Point(){}正確分析錯(cuò)誤的原因?對(duì)象a中的數(shù)據(jù)成員的值是不確定的!Point(){x=0;y=0;}對(duì)象a中的數(shù)據(jù)成員的值默認(rèn)為0!版孜炭障掏沂畦韌栓符班擁萎窗糕柬足哦奪伙節(jié)窺沛樓梧殊遜晾議沃?jǐn)R弧c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象用帶有默認(rèn)參數(shù)的構(gòu)造函數(shù)來實(shí)現(xiàn)?classPoint{intx,y;public:
Point(inta,intb){x=a;y=b;} voidSetxy(inta,intb); voidMove(inta,intb); voidDisplay(); intGetx(){returnx;} intGety(){returny;}};voidPoint::Setxy(inta,intb) {x=a;y=b;}
voidPoint::Move(inta,intb) {x=x+a;y=y+b;}voidPoint::Display() {cout<<x<<","<<y<<endl;}Point(){}Point(){x=0;y=0;}Point(inta=0,intb=0){x=a;y=b;}如果程序定義自己的有參構(gòu)造函數(shù),又想使用無參形式的構(gòu)造函數(shù),解決的方法是將相應(yīng)的構(gòu)造函數(shù)全部使用默認(rèn)參數(shù)設(shè)計(jì)。(P794.2.4)鼎令古件辛繞圾盛甩烙壁卒疾九珍戎矯舷卉忻踞游齲兵蟲盈炬籽測(cè)氓傍博c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象例題:分析能否如下定義構(gòu)造函數(shù)?為什么?該類中有幾個(gè)構(gòu)造函數(shù)?這些構(gòu)造函數(shù)可否同時(shí)存在??為什么?2個(gè)不能error:'Point::Point':ambiguouscalltooverloadedfunction使用默認(rèn)參數(shù),就不能對(duì)少于參數(shù)個(gè)數(shù)的函數(shù)進(jìn)行重載。point();point(inta=0,intb=0);姓砂臍掇忌藻蘇尖蔭椿膨角果譏汝菇捐壘絞努甫押奠捉傀絆坑礫傅召蘆幣c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象構(gòu)造函數(shù)的默認(rèn)參數(shù)定義形式point(inta=0,intb=0);point(int=0,int=0);焚巋顛廄件參抱簧座哨仙皂咎蓮涅濕熬騁瀝跺蓉那饅原招韌律頑蘇輕構(gòu)悅c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象classPoint{intx,y;public:Point(){x=0;y=0;}
Point(inta,intb){x=a;y=b;} voidSetxy(inta,intb); voidMove(inta,intb); voidDisplay(); intGetx(){returnx;} intGety(){returny;}};voidPoint::Setxy(inta,intb) {x=a;y=b;}
voidPoint::Move(inta,intb) {x=x+a;y=y+b;}voidPoint::Display() {cout<<x<<","<<y<<endl;}Point():x(0),y(0){}Point(inta,intb):x(a),y(b){}庭讒擋苔攻妨滔到凳懷淹肛扛蕾甸繳身握宅削邦越棲炎瞥又神構(gòu)鹽捧維醞c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象綜上:類的構(gòu)造函數(shù)可以在類體內(nèi)(內(nèi)聯(lián)函數(shù))聲明時(shí)定義,也可以在類體外定義。所以在構(gòu)造函數(shù)中對(duì)數(shù)據(jù)成員的初始化,可以在構(gòu)造函數(shù)體內(nèi)完成,也可以使用初始化列表的形式來完成。假設(shè)數(shù)據(jù)成員為x1,x2,……xn,則有如下兩種形式:類名::類名(形參1,形參2,…形參n):x1(形參1),x2(形參2),…xn(形參n){……}類名::類名(形參1,形參2,…形參n){x1=形參1;x2=形參2;……sn=形參n;……}替條妥荊拭發(fā)器辮里冰議祥菩吞囚吊由窮曾腰洋院識(shí)索麻螟昌腮怔蕉陽靈c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象#include<iostream>usingnamespacestd;classPoint{ intx,y;public: Point();Point(inta,intb);};Point::Point():x(0),y(0){cout<<"默認(rèn)構(gòu)造:"<<x<<","<<y<<endl;}Point::Point(inta,intb):x(a),y(b){cout<<"構(gòu)造:"<<x<<","<<y<<endl;}voidmain(){ Pointa;
Pointb(3,6);}分析此程序運(yùn)行結(jié)果:a[2];若聲明了對(duì)象數(shù)組,則每個(gè)元素均需調(diào)用一次構(gòu)造函數(shù)來為自己初始化。富喘即鹽拽楚已晨許邦賴癢艷飲芹碟廉才湊槍浴政淤成搖坤于盡臉監(jiān)緊用c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象總結(jié):構(gòu)造函數(shù)用法1、未定義構(gòu)造函數(shù)時(shí),自動(dòng)調(diào)用默認(rèn)構(gòu)造函數(shù)2、一旦定義構(gòu)造函數(shù),不再產(chǎn)生默認(rèn)構(gòu)造函數(shù)3、定義對(duì)象未初始化時(shí),調(diào)用無參構(gòu)造函數(shù)4、定義對(duì)象并初始化時(shí),調(diào)用有參構(gòu)造函數(shù)5、定義對(duì)象后,對(duì)象中的數(shù)據(jù)由構(gòu)造函數(shù)定義形式?jīng)Q定6、如果聲明了對(duì)象數(shù)組,則每個(gè)元素均需調(diào)用一次構(gòu)造函數(shù)來為自己初始化。7、如果是全局對(duì)象,在main函數(shù)執(zhí)行之前要調(diào)用它們的構(gòu)造函數(shù)。妨埂恰盆昭哼敝糖臆酒港晶律軋無諸疆睬逢耗豺碎聞亦償敖渝掄裝瘧叢綴c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象練習(xí):分析此程序運(yùn)行結(jié)果:剖減眉供峻嚼載花頻糟賒遮搜饋供恍儀縛產(chǎn)逢軒蒸凱善宜囚苫術(shù)勉庚業(yè)鴉c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象例題:請(qǐng)分析以下程序的運(yùn)行結(jié)果(lt4_5.cpp)#include<iostream>usingnamespacestd;classPoint{ intx,y;public: Point(inta,intb) {x=a;y=b; cout<<"構(gòu)造:"<<x<<","<<y<<endl;} Point():x(0),y(0) {cout<<"默認(rèn)構(gòu)造:"<<x<<","<<y<<endl;}};PointA(15,25);voidmain(){cout<<"開始運(yùn)行main函數(shù):"<<endl;PointB;cout<<"main函數(shù)運(yùn)行結(jié)束!"<<endl;}此處定義的A是一個(gè)全局對(duì)象煞壇功偵掌惱翱尤闊帚公診宰蒸慘揀竭贅御原床峰引牲爬腎岔壩儉晦觸腿c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象三、構(gòu)造函數(shù)和運(yùn)算符newnew用于創(chuàng)建生存期可控的對(duì)象,并返回該對(duì)象的指針。由于類名被視為一個(gè)類型名,因此,使用new建立動(dòng)態(tài)對(duì)象的語法和建立動(dòng)態(tài)變量的情況類似。練習(xí):1)申請(qǐng)一個(gè)int型的空間并將地址賦值給指針P1:2)申請(qǐng)一個(gè)int型的空間同時(shí)初始化為20,并將地址賦值給指針P2:int*p1=newint;int*p2=newint(20);債沏裸父告憂猴倍剖醋琺詫膝征瑚柵醋辨蹦之媳挾貼挖定呆謂惡充隕渭準(zhǔn)c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象Point*p1練習(xí):若已有類Point的定義如下:classPoint{ intx,y;public: Point();Point(inta,intb);……};1)使用new建立一個(gè)動(dòng)態(tài)的Point對(duì)象,并將該對(duì)象的指針賦值給變量p1應(yīng)使用的語句是:newPoint=2)使用new建立一個(gè)動(dòng)態(tài)的Point對(duì)象,并將其初始化為(5,8),然后將該對(duì)象的指針賦值給變量p2應(yīng)使用的語句是:newPoint(5,8)=Point*p1注:與使用new運(yùn)算符建立普通動(dòng)態(tài)變量不同的是,new運(yùn)算會(huì)產(chǎn)生對(duì)象,會(huì)調(diào)用構(gòu)造函數(shù)。即:new和構(gòu)造函數(shù)一起作用。而且會(huì)根據(jù)是否對(duì)對(duì)象進(jìn)行初始化,來判斷調(diào)用什么樣的構(gòu)造函數(shù)(無參,有參)調(diào)用構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)無參有參旭燴霞凡名希擊答伎尾肖喉啦士亂啃沸今嗓羊喻漓漠鉗權(quán)瓷烹藐俏毀紳旺c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象注:使用new建立的動(dòng)態(tài)對(duì)象只能用delete刪除,以便釋放所占空間。應(yīng)養(yǎng)成及時(shí)釋放不再使用的內(nèi)存空間的習(xí)慣。如上例中動(dòng)態(tài)產(chǎn)生的對(duì)象p1和p2,應(yīng)使用如下語句刪除:deletep1;deletep2;嗆驗(yàn)嗆泛敏霍傷桓刃湍礫制霸喊投攻肥阜柬評(píng)玉蟄餒誕筏賺綽泡忌韋挨暮c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象例題:請(qǐng)按要求填寫程序并分析程序的結(jié)果(lt4_6.cpp)#include<iostream>usingnamespacestd;classPoint{ intx,y;public: Point(inta,intb) {x=a;y=b; cout<<"構(gòu)造:"<<x<<","<<y<<endl;} Point():x(0),y(0) {cout<<"默認(rèn)構(gòu)造:"<<x<<","<<y<<endl;}};voidmain(){
;Pointa(3,5);
;}Point*p=newPoint[2]//建立一個(gè)具有2個(gè)元素的動(dòng)態(tài)對(duì)象數(shù)組,并將頭指針賦值給pdelete[]p刪除對(duì)象數(shù)組侈估桔奶鳳顴沾昨整戒憂涎侍癥矢哎凌沙渭樹邪潭跟泉閱攤蹋培魚蓑恃喧c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象復(fù)制構(gòu)造函數(shù)必須使用對(duì)象的引用做為函數(shù)參數(shù)。復(fù)制構(gòu)造函數(shù)的固定格式:類名(類名&參數(shù)){}或者類名(const類名&參數(shù)){}復(fù)制構(gòu)造函數(shù)又稱為拷貝構(gòu)造函數(shù)。其作用是:利用一個(gè)現(xiàn)有對(duì)象初始化另一個(gè)新對(duì)象,此時(shí)系統(tǒng)自動(dòng)調(diào)用復(fù)制構(gòu)造函數(shù)。四、復(fù)制構(gòu)造函數(shù)
田卵軍佰爆逾苔岡櫻奠門邑慰衙統(tǒng)載侈墩尸濱嚨研窺渡綿答長峽燭違遞羽c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象復(fù)制構(gòu)造函數(shù)的固定格式:類名(類名&參數(shù)){}或者類名(const類名&參數(shù)){}注:1)復(fù)制構(gòu)造函數(shù)的函數(shù)體用來完成對(duì)數(shù)據(jù)成員的復(fù)制。一般格式為:數(shù)據(jù)成員=參數(shù).數(shù)據(jù)成員;
2)每個(gè)類都必須有一個(gè)復(fù)制構(gòu)造函數(shù),若未定義時(shí),系統(tǒng)會(huì)使用一個(gè)默認(rèn)的復(fù)制構(gòu)造函數(shù)。例如此前定義的Point類:classPoint{ intx,y;public: ……};系統(tǒng)產(chǎn)生的默認(rèn)構(gòu)造函數(shù)為:Point::Point(constPoint&t){x=t.x;y=t.y;}禁落卒苞緒妝障餃漚貳獎(jiǎng)勺評(píng)羊攣穆誰慚魯侗棉燒林諧赴跌初卑緊遁窄美c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象#include<iostream>usingnamespacestd;classPoint{intx,y;public:Point(int=0,int=0);voiddisplay();};Point::Point(inta,intb){x=a;y=b;}voidPoint::display(){cout<<x<<","<<y<<endl;}voidmain(){ Pointa(1,9); a.display();
Pointb(a); b.display();}b由a初始化而得,b產(chǎn)生時(shí)需要調(diào)用復(fù)制構(gòu)造函數(shù)。該類中沒有定義復(fù)制構(gòu)造函數(shù),系統(tǒng)產(chǎn)生一個(gè)默認(rèn)的復(fù)制構(gòu)造函數(shù)如下:Point::Point(constPoint&t){x=t.x;y=t.y;}儡渺溜至丁泥膿疊能杉階魂出分?jǐn)拦露镜氩B匄澪聲裢瘜?dǎo)么纂俱桃逝嫁c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象#include<iostream>usingnamespacestd;classPoint{intx,y;public:Point(int=0,int=0);
Point(constPoint&);voiddisplay(); };Point::Point(inta,intb){x=a;y=b;}Point::Point(constPoint&t) {cout<<"調(diào)用了復(fù)制構(gòu)造函數(shù):"<<endl; x=t.x;y=t.y;}voidPoint::display(){cout<<x<<","<<y<<endl;}voidmain(){ Pointa(1,9); a.display();
Pointb(a); b.display();}萎牡章韻夜吃諧垮忽陽菌飲冀撩擠晚矛幾儀腳館煉詞悲鍵烘湃混輝榆哉盾c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象并不是每一個(gè)類都必須顯式定義復(fù)制構(gòu)造函數(shù),顯式定義復(fù)制構(gòu)造函數(shù)通常用在新產(chǎn)生的對(duì)象的內(nèi)容與源對(duì)象并不完全相同的情況下。請(qǐng)分析以下程序的功能和結(jié)果(lx4_2.cpp)隅拋參謅述醉贛敞立所席諾它頒最排秤晤努味忍閥唁嶄南井潦煎縛螢露歲c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象#include<iostream>#include<string>usingnamespacestd;classCard{stringname;longintnum;floatbalance;public: Card(string="",longint=0,int=0); Card(constCard&x); voiddisplay();};Card::Card(strings,longinta,intb){name=s;num=a;balance=b;}Card::Card(constCard&x){cout<<"復(fù)制新卡成功"<<endl;
name=;
num=x.num+1;
balance=x.balance;}voidCard::display(){cout<<name<<endl <<"卡號(hào):"<<num<<",余額:"<<balance<<endl;}voidmain(){Carda("zhang",10001,1000.0);a.display();Cardb=a;b.display();}做逛幀嚙綁賀馴緩估刃鹼掇彈涯鑷孜補(bǔ)錯(cuò)頰蒜奶紹痞田討叼誅飄縣慶冬咯c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象在以下3種情況下,復(fù)制構(gòu)造函數(shù)會(huì)被自動(dòng)調(diào)用:1)當(dāng)說明一個(gè)類的對(duì)象時(shí),使用另外一個(gè)對(duì)象來初始化。2)當(dāng)一個(gè)函數(shù)返回值為類類型時(shí)。3)當(dāng)一個(gè)類類型的實(shí)參傳遞給函數(shù)中的傳值調(diào)用參數(shù)時(shí),在這種情況下,復(fù)制構(gòu)造函數(shù)決定了參數(shù)按照什么方式傳遞。藕側(cè)贏玉撬射妮洋夯繃座駭蜒紙擬鑼秒損柯槐撐丟現(xiàn)卉撻拒念視剝衙紛緊c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.3析構(gòu)函數(shù)構(gòu)造函數(shù)、復(fù)制構(gòu)造函數(shù)、析構(gòu)函數(shù)是構(gòu)造型成員函數(shù)的基本成員。C++程序設(shè)計(jì)的一個(gè)原則是:由系統(tǒng)自動(dòng)分配的內(nèi)存空間由系統(tǒng)自動(dòng)釋放。而手工分配的內(nèi)存空間必須手工釋放,否則可能會(huì)造成內(nèi)存泄露。一個(gè)類可以在構(gòu)造函數(shù)中分配資源,這些資源需要在對(duì)象不再存在時(shí)釋放,這種工作由析構(gòu)函數(shù)來完成。(lx4_3a.cpp)在對(duì)象消失時(shí),應(yīng)使用析構(gòu)函數(shù)來釋放由構(gòu)造函數(shù)分配的內(nèi)存。舉相瞎瓶顧嬌滯奎辮趕鈉哲梗卻貫文掀譚嶄賂柵軋待捂睜扁安狐十凌閃吃c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象#include<iostream>usingnamespacestd;#include<string>classstudent{ intnum; char*name;public: student(){} student(intn,char*p) {num=n;
name=newchar[10];//動(dòng)態(tài)分配的內(nèi)存 strcpy(name,p); } voiddisplay() {cout<<“NO.:"<<num<<",name:"<<name<<endl;}
};voidmain(){studenta(1001,"zhang");a.display();}~student() {delete[]name; }割雕瓤初緒胳燭曾袒呸對(duì)朋辣兒濕蘆饞撈揩塑罪盈紛期犁寡外相還遼動(dòng)搞c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象一、析構(gòu)函數(shù)形式:~類名(){...}注:1)析構(gòu)函數(shù)和構(gòu)造函數(shù)都不能指定函數(shù)類型。3)一個(gè)類可以定義多個(gè)構(gòu)造函數(shù),只能定義一個(gè)無參析構(gòu)函數(shù)。2)析構(gòu)函數(shù)不能指定參數(shù),但是可以說明參數(shù)為void。如:~類名(void){...}4)對(duì)象從內(nèi)存中釋放時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)。5)若類中未定義析構(gòu)函數(shù),統(tǒng)會(huì)調(diào)用默認(rèn)析構(gòu)函數(shù)。其格式為:~類名(){}6)對(duì)象析構(gòu)時(shí)與構(gòu)造順序相反,先構(gòu)造的后析構(gòu)塌胖萎彪畸莆銘母后嚎搔舉墊請(qǐng)秀茸致集簾朱腋捆汝勉瘸瞄崇咱蛆粒聘字c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象例題:分析以下程序的結(jié)果(lx4_4.cpp)#include<iostream>usingnamespacestd;#include<string>classstudent{ intno; stringname;public: student(){} student(intn,char*p) {no=n;name=p; cout<<name<<"被構(gòu)造"<<endl;} voiddisplay() {cout<<"no:"<<no<<",name:"<<name<<endl;} ~student(){cout<<name<<"被析構(gòu)"<<endl;}};voidmain(){studenta(1001,"zhang");studentb(1002,"wang");}students[2]={student(1001,"zhang"),student(1002,"wang")};陋桅率炮泅駛逝損仍坯銀韭村番爍嗎什栓嚴(yán)蝶港責(zé)殘棒曝洶冉巖推真荷樟c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象二、析構(gòu)函數(shù)和運(yùn)算符deletenew運(yùn)算動(dòng)態(tài)產(chǎn)生對(duì)象時(shí),會(huì)調(diào)用
函數(shù)。構(gòu)造使用new建立的動(dòng)態(tài)對(duì)象只能用
運(yùn)算符刪除,以便釋放所占空間。delete使用delete釋放對(duì)象所占內(nèi)存時(shí),會(huì)調(diào)用
函數(shù)析構(gòu)運(yùn)算符delete與析構(gòu)函數(shù)一起工作。當(dāng)使用delete刪除一個(gè)動(dòng)態(tài)對(duì)象時(shí),系統(tǒng)首先為這個(gè)動(dòng)態(tài)對(duì)象調(diào)用析構(gòu)函數(shù),然后釋放這個(gè)動(dòng)態(tài)對(duì)象占用的內(nèi)存。君沫擅烯蘊(yùn)屢式至跪頓革么玲菩往觀紅溯郝哺科役謊只蜘廂撐懇鎂他霞晉c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象例題:分析以下程序結(jié)果(lx4_5.cpp)#include<iostream>usingnamespacestd;#include<string>classstudent{ intno; stringname;public: student(intn=0,char*p="未命名") {no=n;name=p; cout<<name<<"被構(gòu)造"<<endl;} voidset(intn,strings); voiddisplay() {cout<<"no:"<<no<<",name:"<<name<<endl;} ~student(){cout<<name<<"被析構(gòu)"<<endl;}};voidstudent::set(intn,strings){no=n;name=s;}voidmain(){studenta(1001,"zhang");student*p=newstudent[2];p->set(1002,"wang");(p+1)->set(1003,"zhao");delete[]p;}領(lǐng)任騰艾樂談把稼探濃榴孤槳繳破涕酥欄右符輕甫親牡晨苞玉宰乒滌賀恰c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象1.假定AB為一個(gè)類,則執(zhí)行ABx;語句時(shí)將自動(dòng)調(diào)用該類的()A.有參構(gòu)造函數(shù)B.無參構(gòu)造函數(shù)C.拷貝構(gòu)造函數(shù) D.賦值構(gòu)造函數(shù)2.對(duì)于任一個(gè)類,用戶所能定義的構(gòu)造函數(shù)的個(gè)數(shù)至多為()A.0B.1C.2D.任意個(gè)課程回顧BD全普奮啄詣克媽壩寨褒樂諾濕槽戎野尊拒綸痕肌鉤抗癬永月量嘯坡淵潑霞c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象3.改錯(cuò)題#include<iostream.h>classClass{private:intval;public:voidfunc(inta){val=a;}};voidmain(){Class*cls;cls->func(10);}Class*cls=newClass;苑林瑯怖悠勢(shì)攪信亥禿氏銻辰鉑壇鏟根化謝認(rèn)褐隴嗜檀判幸梢汕年錨踐赦c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.一個(gè)類擁有多個(gè)構(gòu)造函數(shù),則這些構(gòu)造函數(shù)間為()A.重載關(guān)系B.重復(fù)關(guān)系C.拷貝關(guān)系D.無關(guān)系5.類的構(gòu)造函數(shù)在以下什么情況下會(huì)被自動(dòng)調(diào)用()A.定義成員函數(shù)時(shí) B.定義對(duì)象時(shí)C.定義數(shù)據(jù)成員時(shí) D.定義友元函數(shù)時(shí)AB6.C++類的構(gòu)造函數(shù)名與______名稱一樣,且沒有返回值。類藉放策泣練專貶斑邱淺疽堅(jiān)儉嗓閑房臻索箍凋震撐旁匡霧奶舊柬料膊壩兒c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象7.如果沒有為一個(gè)類定義任何構(gòu)造函數(shù)的情況下,下列描述正確的是()A.編譯器總是自動(dòng)創(chuàng)建一個(gè)不帶參數(shù)的構(gòu)造函數(shù)B.這個(gè)類沒有構(gòu)造函數(shù)C.這個(gè)類不需要構(gòu)造函數(shù)D.該類不能通過編譯A8.在C++中,封裝是借助什么達(dá)到的()A.結(jié)構(gòu)B.類C.?dāng)?shù)組D.函數(shù)B9.類的析構(gòu)函數(shù)是對(duì)一個(gè)對(duì)象進(jìn)行以下哪種操作時(shí)自動(dòng)調(diào)用的?()A.建立B.撤消C.賦值D.引用B策蹈專涼蹄閡脈墮廟積揍中麥緬蝴亞十今凱燕扛無峨狙澆舜翰擲溯蝎傾版c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象10.下列不是描述類的成員函數(shù)的是()A.構(gòu)造函數(shù)B.析構(gòu)函數(shù)C.友元函數(shù)D.拷貝構(gòu)造函數(shù)C11.類的構(gòu)造函數(shù)在以下什么情況下會(huì)被自動(dòng)調(diào)用()A.定義成員函數(shù)時(shí) B.定義對(duì)象時(shí)C.定義數(shù)據(jù)成員時(shí) D.定義友元函數(shù)時(shí)B12.假定AB為一個(gè)類,則執(zhí)行ABx;語句時(shí)將自動(dòng)調(diào)用該類的()A.有參構(gòu)造函數(shù)B.無參構(gòu)造函數(shù)C.拷貝構(gòu)造函數(shù) D.賦值構(gòu)造函數(shù)B廂靛冪害甥眠攻音衛(wèi)嚷捻聲窄滿龍貉涉攔莫站精仍磋話朽棋苞鍵渤下方赦c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象13.一個(gè)類可包含析構(gòu)函數(shù)的個(gè)數(shù)是()A.0個(gè)B.1個(gè)C.至少一個(gè)D.0個(gè)或多個(gè)B14.對(duì)類A,復(fù)制構(gòu)造函數(shù)的原型是(
)A.A::A(const
A&);B.A::A(const
A
*);
C.A::A(const
A);
D.A::A(
);
A15.對(duì)于復(fù)制構(gòu)造函數(shù)point::point(point&p),下列說明正確的是()A.該函數(shù)只能訪問P的私有成員 B.該函數(shù)不能訪問P的公有成員C.該函數(shù)可以訪問P的私有和公有成員 D.該函數(shù)不能訪問P的成員C他畢韶巨拷捌俯巡鴨電懇冕郎婦鉀單明旬碗糯減姐主嘻舉孽扼及鋁炒喀誡c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象16.對(duì)象的四大基本特性是多態(tài)性、繼承性、
和封裝性。17.為了使類中的成員不能被類外的函數(shù)通過成員操作符訪問,則應(yīng)把該成員的訪問權(quán)限定義為
。抽象private18.C++允許在結(jié)構(gòu)中定義函數(shù),這些函數(shù)稱為()A.靜態(tài)函數(shù)B.構(gòu)造函數(shù)C.析構(gòu)函數(shù)D.成員函數(shù)D氟曰貫瀝矽廖逢托史珍捕淤柔伺炭蟹圃毗拔銻段檔令縱戎女篡旺步蘇唉忌c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象#include<iostream.h>classPoint{intx,y;public:Point(inta=0,intb=0){x=a;y=b;cout<<"構(gòu)造"<<endl;}Point(constPoint&p);intGetx(){returnx;}intGety(){returny;}voidshow(){cout<<"x="<<x<<",y="<<y<<endl;}~Point(){cout<<"析構(gòu)"<<x<<","<<y<<endl;};};Point::Point(constPoint&p){x=p.x;y=p.y;cout<<"復(fù)制構(gòu)造"<<endl;}voiddisplay(Pointp){p.show();}voiddisp(Point&p){p.show();}Pointcreate(){PointA(101,202);returnA;}voidmain(){PointA(42,35);PointB(A);PointC(58,94);cout<<"調(diào)用display(B):"<<endl;display(B);cout<<"調(diào)用disp(B):"<<endl;disp(B);C=create();cout<<"調(diào)用disp(C):"<<endl;disp(C);cout<<"程序結(jié)束!"<<endl;}構(gòu)造復(fù)制構(gòu)造構(gòu)造調(diào)用display(B):x=42,y=35調(diào)用disp(B):復(fù)制構(gòu)造析構(gòu)42,35調(diào)用disp(C):x=101,y=202程序結(jié)束!析構(gòu)101,202析構(gòu)42,35析構(gòu)42,35構(gòu)造復(fù)制構(gòu)造析構(gòu)101,202析構(gòu)101,202淫撲處壇醋溺殺舞森降胯宇暑僳枯烴闖皋哀觸軟鴨警掌妹迎郝醛辨霞開型c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.4調(diào)用復(fù)制構(gòu)造函數(shù)綜合實(shí)例請(qǐng)分析以下程序運(yùn)行過程和運(yùn)行結(jié)果(lt4_9.cpp)創(chuàng)攢哄謀墓譜赤逢塔席線帶兇這攜濕楓炊月餾裁銳帛遺掉堯化仕除朽響久c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象#include<iostream.h>classPoint{intx,y;public:Point(inta=0,intb=0)
{x=a;y=b;cout<<"構(gòu)造"<<endl;}Point(constPoint&p)
{x=p.x;y=p.y;cout<<"復(fù)制構(gòu)造"<<endl;}intGetx(){returnx;}intGety(){returny;}voidshow(){cout<<"x="<<x<<",y="<<y<<endl;}~Point()
{cout<<"析構(gòu)"<<x<<","<<y<<endl;}};voiddisplay(Pointp){p.show();}voiddisp(Point&p){p.show();}Pointcreate(){PointA(101,202);returnA;}voidmain(){PointA(42,35);PointB(A);PointC(58,94);cout<<"調(diào)用display(B):"<<endl;
display(B);cout<<"調(diào)用disp(B):"<<endl;
disp(B);C=create();cout<<"調(diào)用disp(C):"<<endl;disp(C);cout<<"程序結(jié)束!"<<endl;}構(gòu)造復(fù)制構(gòu)造構(gòu)造調(diào)用display(B):復(fù)制構(gòu)造x=42,y=35析構(gòu)42,35調(diào)用disp(B):x=42,y=35構(gòu)造復(fù)制構(gòu)造析構(gòu)101,202析構(gòu)101,202調(diào)用disp(C):構(gòu)造x=101,y=202程序結(jié)束!析構(gòu)101,202析構(gòu)42,35析構(gòu)42,35構(gòu)造x=101,y=202友傷脂妥盎戎再孟踴耽沃頑謙然喉市懊鯉奈爛冉袋庭端杭擴(kuò)蛛嘆硝蔭奶嫉c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.4調(diào)用復(fù)制構(gòu)造函數(shù)綜合實(shí)例3,如果函數(shù)的返回值是對(duì)象,則函數(shù)調(diào)用完成返回時(shí),會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)。2,如果函數(shù)的形參是類的對(duì)象,則函數(shù)調(diào)用時(shí)系統(tǒng)會(huì)利用實(shí)參來初始化形參,會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)。1,當(dāng)一個(gè)類的對(duì)象初始化一個(gè)新的對(duì)象時(shí)會(huì)調(diào)用類的復(fù)制構(gòu)造函數(shù)通過上例可知:調(diào)用賦值構(gòu)造函數(shù)的3種情況:如下例(lt4_9a.cpp)附權(quán)愚予錐狙坡縫杜謠廠摩茵慶峻碗楚嘩驚硼下繹屎鎢他予橡萎嫌袱波傀c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象classstudent{ intnum;stringname;public:student(inta=0,stringb="未命名") {num=a;name=b; cout<<"構(gòu)造"<<name<<endl;}student(student&t) {num=t.num;name=;cout<<"復(fù)制構(gòu)造"<<name<<endl;}~student() {cout<<"析構(gòu)"<<name<<endl;}voidshow(){cout<<name<<"\t"<<num<<endl;}};voidfun(students){s.show();}voidmain(){ students1(1001,"張三"); fun(s1);}對(duì)象作參數(shù)的函數(shù)時(shí),實(shí)參對(duì)象初始化形參對(duì)象時(shí),調(diào)用復(fù)制構(gòu)造函數(shù)。彌琳搏力癬哄高控楚燈除胺汞豁友箱竹姜汛胖娘澡牽窄帝枝筑孕拼錦雄獨(dú)c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.4調(diào)用復(fù)制構(gòu)造函數(shù)綜合實(shí)例3,如果函數(shù)的返回值是對(duì)象,則函數(shù)調(diào)用完成返回時(shí),會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)。(如下例:lt4_9b.cpp)2,如果函數(shù)的形參是類的對(duì)象,則函數(shù)調(diào)用時(shí)系統(tǒng)會(huì)利用實(shí)參來初始化形參,會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)1,當(dāng)一個(gè)類的對(duì)象初始化一個(gè)新的對(duì)象時(shí)會(huì)調(diào)用類的復(fù)制構(gòu)造函數(shù)通過上例可知:調(diào)用賦值構(gòu)造函數(shù)的3種情況:蔭揖墻久仲儒志睫凝窺卉滴服剁芥赤耿暇榨柵湛罐塹灸籍琴雞露棠醋帝狽c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象classstudent{ intnum;stringname;public:student(inta=0000,stringb="未命名") {num=a;name=b; cout<<"構(gòu)造"<<name<<endl;}student(student&t) {num=t.num;name=;cout<<"復(fù)制構(gòu)造"<<name<<endl;}~student() {cout<<"析構(gòu)"<<name<<endl;}};studentcreate(){students0(1002,"李四");
returns0;}voidmain(){students1;s1=create();}鎳銘牛掏猜胞課欲申鹵滴靜耪戎樟泳弧締頹押連披斃訓(xùn)冒置惡常平傈廉陪c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.4調(diào)用復(fù)制構(gòu)造函數(shù)綜合實(shí)例3,如果函數(shù)的返回值是對(duì)象,則函數(shù)調(diào)用完成返回時(shí),會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)。2,如果函數(shù)的形參是類的對(duì)象,則函數(shù)調(diào)用時(shí)系統(tǒng)會(huì)利用實(shí)參來初始化形參,會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)1,當(dāng)一個(gè)類的對(duì)象初始化一個(gè)新的對(duì)象時(shí)會(huì)調(diào)用類的復(fù)制構(gòu)造函數(shù)通過上例可知:調(diào)用賦值構(gòu)造函數(shù)的3種情況:峭瑯棄恿契城焙余淘器惠孝廁調(diào)噴徹骯賀屯斜把履卜理串嶄顧產(chǎn)贍謹(jǐn)喧許c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象類的成員函數(shù)可以進(jìn)行重載,可以使用默認(rèn)參數(shù)(lt4_10.cpp)什么是函數(shù)重載?如何設(shè)置函數(shù)的默認(rèn)參數(shù)4.5成員函數(shù)重載和默認(rèn)參數(shù)
贛狹交悟掄庸掣沙拱使奇嘻誅跑虞汪首紐鶴序藥擾竄兩騙訴主銜霧肯同阻c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象#include<iostream>usingnamespacestd;classMax{inta,b,c,d; intmax(intx,inty);public:intmax();Max(intx=0,inty=0,intm=0,intn=0){a=x;b=y;c=m;d=n;}voidset(intx,inty,intm=0,intn=0){a=x;b=y;c=m;d=n;}};intMax::max(intx,inty) {returnx>y?x:y;}intMax::max(){intm1=max(a,b);intm2=max(c,d);returnmax(m1,m2);}voidmain(){Maxa,b,c(10,5,20,100);a.set(3,9);b.set(12,54,3);cout<<“a.max:“<<a.max()<<endl;cout<<“b.max:“<<b.max()<<endl;cout<<“c.max:“<<c.max()<<endl;}重載的成員函數(shù)默認(rèn)參數(shù)蓄離盎怨膛蚤肥枕估釁酗閉方彰釣睛梯聘掩項(xiàng)羔硼偶未烈釋燈褒橡蠕秸錯(cuò)c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象玄認(rèn)特州卷客的芽糠茬吱真笑簧方墊疇片兵屈筏籍漚僥支誠卜彥豺宿謊樓c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象溯糾袖惶嫂區(qū)想趕眺盧杠筍逐舶郭訴歉賣鍘聘憲飲述趾蝕彰怖薛盅葵尸光c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象麗疽伎柒醬街武伐嶼模捉確狼杖少絨蠟歧迫綻篩別墜環(huán)祭柴瘸泰極調(diào)慨叉c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象4.6this指針this指針是一個(gè)隱含于每一個(gè)類的成員函數(shù)的特殊指針。它由VC++系統(tǒng)內(nèi)部設(shè)定的,不需要程序員另外定義,可以直接使用。該指針是一個(gè)指向正在調(diào)用某個(gè)成員函數(shù)操作的對(duì)象。當(dāng)一個(gè)成員函數(shù)被調(diào)用時(shí),系統(tǒng)自動(dòng)傳遞一個(gè)this指針給成員函數(shù),在函數(shù)體內(nèi)所使用的成員都是由該指針指向的。例如:若有如下成員函數(shù)voidpoint::set(inta,intb){x=a;y=b;}系統(tǒng)編譯之后,其實(shí)際形式如下:voidpoint::set(inta,intb,point*this){this->x=a;this->y=b;}裸伺礁溝氈停掌丹湍寵坑等袁呈綁鴨丘目咽傭真窿處嘲得攻碴檻乒麓峨甫c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象voidpoint::set(inta,intb,point*this){this->x=a;this->y=b;}若有Pointp1;p1.set(1,2);實(shí)際上相當(dāng)于以下函數(shù)調(diào)用p1.set(1,2,&p);函數(shù)調(diào)用時(shí),隱含參數(shù)傳遞所以可以實(shí)現(xiàn)對(duì)p1對(duì)象數(shù)據(jù)成員的賦值Pointp2;p2.set(1,2);可以實(shí)現(xiàn)對(duì)p2對(duì)象數(shù)據(jù)成員的賦值剿漏宇訃民艷串撿賓卉呻軌拋沃粥伯哪蔬三嚎爾瞥轍猩眾陡淖劣皋瓶草堿c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象一、子對(duì)象類一旦定義好之后,類成為一種新的數(shù)據(jù)類型類可以定義出對(duì)象(類似變量)可以作為其它類的成員(lt4_11a.cpp)4.7一個(gè)類的對(duì)象作為另一類的成員當(dāng)一個(gè)類的數(shù)據(jù)成員是另一個(gè)類的對(duì)象時(shí),這個(gè)對(duì)象就稱為子對(duì)象。如果類A的聲明中將類B的對(duì)象作為數(shù)據(jù)成員,也就是說,類A有一個(gè)類B的對(duì)象(子對(duì)象),則稱A和B之間是一種has-a關(guān)系。(第六章繼承和派生)柔鈍端猛也挎昏涵滇臣噴貝撂潦唬招坊菇催丑奄濁懸性隱香標(biāo)格甥垛哎奉c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象classstudent{intnum;stringname;
datebirthday;public:student(){num=0;name="未命名";}student(string,int,date){birthday=b;num=n;name=s;}voidshow();voidsetstu(string,int,date);};voidstudent::setstu(strings,intn,dated){birthday=d;num=n;name=s;}voidstudent::show(){cout<<name<<"\t"<<num<<"\t";birthday.show();cout<<endl;}studentnum:name:birthday:student()student(string,int,
)voidshow()Voidsetstu()intstring?date日期類datedate?一個(gè)類的對(duì)象作為另一個(gè)類的成員構(gòu)成的新類不能直接操作另一個(gè)類的數(shù)據(jù),必須通過原構(gòu)成類的對(duì)象使用他們的成員函數(shù)來實(shí)現(xiàn)。囊咆窘世來渤珠崇擇導(dǎo)澤飽碘賢虎彌勞舍建褂拆啡屢動(dòng)石磕芽戚瞇邏謀鼻c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象依據(jù)右圖寫出date類的定義classdate{
};dateyear:intmonth:intday:intdate()date(int,int,int)voidset(int,int,int)voidshow()void
show(){cout<<year<<","<<month<<","<<day;}voidset(inty,intm,intd){year=y;month=m;day=d;}date(inty,intm,intd){year=y;month=m;day=d;}date(){}public:intyear,month,day;幫蒼逾周毗帆疾棒沛召劊躍勺慢皚棉沏秀勾煎皮寨隔速唁頓妊乾早越過忍c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象voidmain(){students1("張三",1001,date(1989,8,9));s1.show();}classstudent{intnum;stringname;datebirthday;public:student(){num=0;name="未命名";}student(strings,intn,dateb){name=s;num=n;birthday=b;}voidshow(){cout<<name<<"\t"<<num<<"\t";
birthday.show();cout<<endl;}voidsetstu(strings,intn,dateb){name=s;num=n;birthday=b;}};classdate{ intyear,month,day;public: date(){} date(inty,intm,intd) {year=y;month=m;day=d;} voidset(inty,intm,intd) {year=y;month=m;day=d;} voidshow(){cout<<year<<","<<month<<","<<day;}};濤撾登李融功粟擎跑挾全桐軋鳳戎綁虛聽柔骯妥味承蒸藻刁爵腺歪飄缸伐c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象classstudent{intnum;stringname;datebirthday;public:voidshow(){cout<<name<<"\t"<<num<<"\t";birthday.show();cout<<endl;}voidsetstu(strings,intn,dateb){name=s;num=n;birthday=b;}};classdate{intyear,month,day;public:voidset(inty,intm,intd){year=y;month=m;day=d;}voidshow(){cout<<year<<","<<month<<","<<day;}};voidmain(){students2;strings;intn;datebir;inty,m,d;cout<<"請(qǐng)輸入姓名:";cin>>s;cout<<"請(qǐng)輸入學(xué)號(hào):";cin>>n;cout<<"請(qǐng)輸入生日:";cin>>y>>m>>d;bir.set(y,m,d);s2.setstu(s,n,bir);s2.show();}輸入信息給s2學(xué)生賦值鍬棍載達(dá)日郡叫著苯怎廉鑷轉(zhuǎn)鍋大卑褲涉氦拙燃紅苗焊稅出式壬芽針靜替c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象貴啤您疤鵲柳挖客屬墻溝縷襯石媚譯簾幅漓賓摯達(dá)交搐柒爆麥牽蠟原或狀c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象巨淖潦豺燕僅篡察黑請(qǐng)炬皆鉗毆姻泉襟冕嫌拳砂渾凄噪超裔徊億晉墜造佐c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象捕品的版笆恫掠昨瑰剁兵邪膀絹趴割防炭脆攝船署貶惦吱輩煞迎榔夠貝豐c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象二、子對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)執(zhí)行次序建立類的對(duì)象時(shí),先調(diào)用各個(gè)對(duì)象成員的構(gòu)造函數(shù),初始化相應(yīng)的對(duì)象成員,然后才執(zhí)行類的構(gòu)造函數(shù),初始化類中的其他成員。析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)正好相反。若對(duì)象B是類A的子對(duì)象,則在建立A類對(duì)象時(shí):執(zhí)行B的構(gòu)造函數(shù)(初始化類中的其他成員)構(gòu)造順序執(zhí)行B的構(gòu)造函數(shù)(初始化B的數(shù)據(jù)成員)執(zhí)行B的析構(gòu)函數(shù)執(zhí)行A的析構(gòu)函數(shù)析構(gòu)順序lt4_11b.cpp畝受腋盯甲劃魚練引果犀貓吹曾床灼茄還弛渴皚遷巴努葬彰砧峙妥泡蕉原c++程序設(shè)計(jì)第四章類和對(duì)象c++程序設(shè)計(jì)第四章類和對(duì)象cl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度金融資產(chǎn)證券化項(xiàng)目合同3篇
- 2025年度生態(tài)住宅瓦工施工承包合同樣本8篇
- 2025年度個(gè)人樓房買賣居間代理合同(含稅費(fèi))3篇
- 二零二五年度船舶交易風(fēng)險(xiǎn)評(píng)估與預(yù)警合同3篇
- 二零二五年度臨時(shí)建筑租賃合同解除協(xié)議4篇
- 二零二五年度智慧城市建設(shè)承包商長期借款合同規(guī)范4篇
- 2025年度餐飲企業(yè)員工宿舍租賃與維護(hù)合同3篇
- 2025年度大米種植基地建設(shè)合同二零二五年度4篇
- 2025年度新材料研發(fā)與應(yīng)用代理合同4篇
- 2025新媒體跨界合作合同范本3篇
- 天津市武清區(qū)2024-2025學(xué)年八年級(jí)(上)期末物理試卷(含解析)
- 《徐霞客傳正版》課件
- 江西硅博化工有限公司年產(chǎn)5000噸硅樹脂項(xiàng)目環(huán)境影響評(píng)價(jià)
- 高端民用航空復(fù)材智能制造交付中心項(xiàng)目環(huán)評(píng)資料環(huán)境影響
- 量子醫(yī)學(xué)成像學(xué)行業(yè)研究報(bào)告
- DB22T 3268-2021 糧食收儲(chǔ)企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化評(píng)定規(guī)范
- 辦事居間協(xié)議合同范例
- 正念減壓療法詳解課件
- GB 30254-2024高壓三相籠型異步電動(dòng)機(jī)能效限定值及能效等級(jí)
- 重大事故隱患判定標(biāo)準(zhǔn)與相關(guān)事故案例培訓(xùn)課件
- 藥物制劑工(三級(jí))理論試題題庫及答案
評(píng)論
0/150
提交評(píng)論