版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
構(gòu)造函數(shù)與析構(gòu)函數(shù)對(duì)象的初始化--構(gòu)造函數(shù)當(dāng)一個(gè)對(duì)象創(chuàng)建時(shí),它將獲得一塊存儲(chǔ)空間,該存儲(chǔ)空間用于存儲(chǔ)對(duì)象的數(shù)據(jù)成員。在使用對(duì)象前,需要對(duì)對(duì)象存儲(chǔ)空間中的數(shù)據(jù)成員進(jìn)行初始化。C++提供了一種對(duì)象初始化的機(jī)制:構(gòu)造函數(shù)它是類的特殊成員函數(shù),名字與類名相同、無(wú)返回值類型。創(chuàng)建對(duì)象時(shí),構(gòu)造函數(shù)會(huì)被自動(dòng)調(diào)用。例如:classA{ intx,y; public:
A(){x=0;y=0;}//構(gòu)造函數(shù)
......};......Aa;//創(chuàng)建對(duì)象a:為a分配內(nèi)存空間,然后調(diào)用A類的構(gòu)造函數(shù)A()。a00x:y:構(gòu)造函數(shù)可以重載,其中,不帶參數(shù)的(或所有參數(shù)都有默認(rèn)值的)構(gòu)造函數(shù)被稱為默認(rèn)構(gòu)造函數(shù)。例如:classA{ intx,y; public: A()//默認(rèn)構(gòu)造函數(shù)
{x=y=0; } A(intx1) { x=x1;y=0; } A(intx1,inty1) { x=x1;y=y1; } ......};也可以寫成功能等價(jià)的形式:classA{intx,y;public: A(intx1=0,inty1=0) { x=x1;y=y1; } ......};在創(chuàng)建對(duì)象時(shí),如果沒(méi)有指定調(diào)用對(duì)象類中哪一個(gè)構(gòu)造函數(shù),則調(diào)用默認(rèn)構(gòu)造函數(shù)初始化。也可以顯式地指定調(diào)用對(duì)象類的某個(gè)構(gòu)造函數(shù)。classA{ ...... public: A(); A(inti); A(char*p);};......Aa1;//調(diào)用默認(rèn)構(gòu)造函數(shù)。也可寫成:Aa1=A();
//但不能寫成:Aa1();Aa2(1);//調(diào)用A(inti)。也可寫成:Aa2=A(1);或Aa2=1;Aa3("abcd");//調(diào)A(char*)。也可寫成:Aa3=A("abcd"); //或Aa3="abcd";Aa[4];//調(diào)用對(duì)象a[0]、a[1]、a[2]、a[3]的默認(rèn)構(gòu)造函數(shù)。Ab[5]={A(),A(1),A("abcd"),2,"xyz"};//調(diào)用b[0]的A()、
//b[1]的A(int)、b[2]的A(char*)、 //b[3]的A(int)和b[4]的A(char*)A*p1=newA;//調(diào)用默認(rèn)構(gòu)造函數(shù)A*p2=newA(2);//調(diào)用A(inti)A*p3=newA("xyz");//調(diào)用A(char*)A*p4=newA[20];//創(chuàng)建動(dòng)態(tài)對(duì)象數(shù)組時(shí) //只能調(diào)用各對(duì)象的默認(rèn)構(gòu)造函數(shù)在程序中也可以通過(guò)類的構(gòu)造函數(shù)來(lái)創(chuàng)建一些臨時(shí)對(duì)象。例如:voidf(Aa);......f(A(10));//創(chuàng)建一個(gè)臨時(shí)對(duì)象傳給函數(shù)f注意:對(duì)象創(chuàng)建后,不能再調(diào)用構(gòu)造函數(shù)!例如:Aa;......a.A(1);//Error!常量和引用數(shù)據(jù)成員的初始化對(duì)于常量和引用數(shù)據(jù)成員,C++舊版本不能在說(shuō)明它們時(shí)初始化,也不能采用賦值操作在構(gòu)造函數(shù)中對(duì)它們初始化。例如:
classA{ intx;
constinty=1;//Errorint&z=x;//Errorpublic:A(){x=0;//OK y=1;//Error
z=&x;//Error
z=x;//Error
}};那在哪兒對(duì)它們初始化呢?可以在構(gòu)造函數(shù)的函數(shù)頭和函數(shù)體之間加入一個(gè)成員初始化表來(lái)對(duì)常量和引用數(shù)據(jù)成員進(jìn)行初始化。例如:classA{intx; constinty; int&z;public: A():z(x),y(1)//成員初始化表
{x=0; }};在成員初始化表中,成員的書寫次序并不決定它們的初始化次序,它們的初始化次序由它們?cè)陬惗x中的描述次序來(lái)決定。成員初始化表析構(gòu)函數(shù)在類中可以定義一個(gè)特殊的成員函數(shù):析構(gòu)函數(shù),它的名字為“~<類名>”,沒(méi)有返回類型、不帶參數(shù)、不能被重載。例如:classA{......
public:
......
~A();//析構(gòu)函數(shù)};一個(gè)對(duì)象消亡時(shí),系統(tǒng)在收回它的內(nèi)存空間之前,將會(huì)自動(dòng)調(diào)用對(duì)象類中的析構(gòu)函數(shù)。可以在析構(gòu)函數(shù)中完成對(duì)象被刪除前的一些清理工作。一般情況下,類中不需要自定義析構(gòu)函數(shù),但如果對(duì)象創(chuàng)建后,自己又額外申請(qǐng)了資源(如:額外申請(qǐng)了內(nèi)存空間),則可以自定義析構(gòu)函數(shù)來(lái)歸還它們。例如,系統(tǒng)為對(duì)象s1分配的內(nèi)存空間只包含len和str(指針)本身所需的空間,str所指向的空間不是由系統(tǒng)分配和歸還的,而是由對(duì)象作為資源自己申請(qǐng)和歸還的:classString{intlen;char*str;public:String(char*s){len=strlen(s);str=newchar[len+1];//申請(qǐng)額外的內(nèi)存空間strcpy(str,s);}~String(){delete[]str;//歸還額外申請(qǐng)的空間
len=0;str=NULL;//有必要嗎?}......};voidf(){Strings1("abcd");//調(diào)用s1的構(gòu)造函數(shù)
......}//調(diào)用s1的析構(gòu)函數(shù)s1len:str:4abcd再例如:用鏈表實(shí)現(xiàn)的棧類,由于鏈表中的結(jié)點(diǎn)空間是push操作申請(qǐng)的,如果pop操作數(shù)量不夠,則對(duì)象消亡時(shí)要在析構(gòu)函數(shù)中歸還它們!classStack{ public: Stack(){top=NULL;}
~Stack()
//析構(gòu)函數(shù)
{while(top!=NULL)
{Node*p=top;top=top->next;
deletep;
}
}
voidpush(inti);
voidpop(int&i); private: structNode {intcontent; Node*next; }*top;};析構(gòu)函數(shù)可以顯式調(diào)用,這時(shí)并不是讓對(duì)象消亡,而是暫時(shí)歸還對(duì)象額外申請(qǐng)的資源。例如,Strings1("abcd");......s1.~String();//把字符串s1清空,對(duì)象并未消亡!...s1...//仍然可以使用對(duì)象s1再例如,Stackst;...st.push...st.pop...st.~Stack();//清空棧st...st.push...st.pop...//仍然可以使用棧st成員對(duì)象的初始化和消亡處理如果創(chuàng)建的對(duì)象包含成員對(duì)象,那么,成員對(duì)象如何進(jìn)行初始化和消亡處理?在創(chuàng)建包含成員對(duì)象的對(duì)象時(shí),除了會(huì)自動(dòng)調(diào)用本身類的構(gòu)造函數(shù)外,還會(huì)自動(dòng)去調(diào)用成員對(duì)象類的構(gòu)造函數(shù)。通常是調(diào)用成員對(duì)象類的默認(rèn)構(gòu)造函數(shù)。如果要調(diào)用成員對(duì)象類的非默認(rèn)構(gòu)造函數(shù),需要在包含成員對(duì)象的對(duì)象類的構(gòu)造函數(shù)成員初始化表中顯式指出!包含成員對(duì)象的對(duì)象消亡時(shí),除了會(huì)自動(dòng)調(diào)用本身類的析構(gòu)函數(shù)外,還會(huì)自動(dòng)去調(diào)用成員對(duì)象類的析構(gòu)函數(shù)。classA{intx;public: A(){x=0;} A(inti){x=i;}};classB{Aa;inty;public:B(){y=0;}
B(inti){y=i;}
B(inti,intj):a(j){y=i;}};Bb0;//調(diào)用B()和A():b0.y=0;b0.a.x=0Bb1(1);//調(diào)用B(int)和A():b1.y=1;b1.a.x=0Bb2(1,2);//調(diào)用B(int,int)和A(int):b2.y=1;b2.a.x=2......//b0、b1、b2消亡時(shí),會(huì)分別去調(diào)用B和A的析構(gòu)函數(shù)創(chuàng)建包含成員對(duì)象的對(duì)象時(shí),先執(zhí)行成員對(duì)象類的構(gòu)造函數(shù),再執(zhí)行本對(duì)象類的構(gòu)造函數(shù)。若包含多個(gè)成員對(duì)象,這些成員對(duì)象的構(gòu)造函數(shù)執(zhí)行次序則按它們?cè)诒緦?duì)象類中的說(shuō)明次序進(jìn)行。從實(shí)現(xiàn)上說(shuō),是先調(diào)用本身類的構(gòu)造函數(shù),但在進(jìn)入函數(shù)體之前,會(huì)去調(diào)用成員對(duì)象類的構(gòu)造函數(shù),然后再執(zhí)行本身類構(gòu)造函數(shù)的函數(shù)體!也就是說(shuō),構(gòu)造函數(shù)的成員初始化表(即使沒(méi)顯式給出)中有對(duì)成員對(duì)象類的構(gòu)造函數(shù)的調(diào)用代碼。注意:如果類中未提供任何構(gòu)造函數(shù),但它包含成員對(duì)象,則編譯程序會(huì)隱式地為之提供一個(gè)默認(rèn)構(gòu)造函數(shù),其作用就是調(diào)用成員對(duì)象類的構(gòu)造函數(shù)!成員對(duì)象初始化和消亡處理的次序?qū)ο笙鰰r(shí),先執(zhí)行本身類的析
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 營(yíng)養(yǎng)童樂(lè)園教具課程設(shè)計(jì)
- 鍋爐課程設(shè)計(jì)論文
- 軸的機(jī)械課程設(shè)計(jì)
- 二零二五年度科技孵化器場(chǎng)地租賃合同解除書
- 二零二五年度網(wǎng)絡(luò)直播內(nèi)容版權(quán)轉(zhuǎn)讓合同范本
- 2025年度駕校與學(xué)員簽訂的二零二五年度駕駛培訓(xùn)學(xué)員節(jié)假日培訓(xùn)合同
- 2025年度綠色出行車按揭合同模板
- 二零二五年度2025年度房產(chǎn)贈(zèng)與股東合同
- 香草甜品教室課程設(shè)計(jì)
- 鍋爐課程設(shè)計(jì)文檔
- 門窗幕墻密封條培訓(xùn)
- 關(guān)于成立低空經(jīng)濟(jì)公司可行性分析報(bào)告
- GB/T 44545-2024制冷系統(tǒng)試驗(yàn)
- 北師大版四年級(jí)數(shù)學(xué)上冊(cè)口算天天練題卡2
- 滑模施工計(jì)算書及相關(guān)圖紙
- DB11T 2279-2024 社會(huì)單位消防安全評(píng)估規(guī)范
- 《電力電纜試驗(yàn)》課件
- JJF 2122-2024 機(jī)動(dòng)車測(cè)速儀現(xiàn)場(chǎng)測(cè)速標(biāo)準(zhǔn)裝置校準(zhǔn)規(guī)范
- 充電樁四方協(xié)議書范本
- 2024年南京鐵道職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案解析
- 2023年信息處理技術(shù)員教程
評(píng)論
0/150
提交評(píng)論