構(gòu)造函數(shù)簡介
在上一個(gè)章節(jié)我們在創(chuàng)建好類的對象之后鱼喉,首先對它的每一個(gè)成員屬性賦值之后再對它們進(jìn)行輸出操作虐秋,如果不賦值就輸出,這些值就會是垃圾值努潘。而為了代碼的簡介诽偷,一次性為所有成員屬性初始化坤学,C++的類提供了這樣的一個(gè)函數(shù)—構(gòu)造函數(shù)。
C++提供構(gòu)造函數(shù)來處理對象的初始化报慕。
1.構(gòu)造函數(shù)是一種特殊的成員函數(shù)深浮,不需要用戶來調(diào)用,定義對象時(shí)被自動(dòng)執(zhí)行眠冈。
2.構(gòu)造函數(shù)名字與類名相同飞苇,無返回類型。
3.可以由用戶自己定義實(shí)現(xiàn)蜗顽,根據(jù)需要設(shè)計(jì)對數(shù)據(jù)成員進(jìn)行初始化布卡,依舊可以設(shè)置函數(shù)的默認(rèn)參數(shù)。
4.如果我們沒有定義構(gòu)造函數(shù)诫舅,系統(tǒng)會為我們自動(dòng)定義一個(gè)無參的默認(rèn)構(gòu)造函數(shù)的羽利,它不對成員屬性做任何操作,如果我們自己定義了構(gòu)造函數(shù)刊懈,系統(tǒng)就不會為我們創(chuàng)建默認(rèn)構(gòu)造函數(shù)了这弧。
默認(rèn)參數(shù)構(gòu)造函數(shù)
CTime() { }
帶參數(shù)的構(gòu)造函數(shù):這樣的一個(gè)構(gòu)造函數(shù)提供了一個(gè)三個(gè)成員屬性的初始化,聲明對象的時(shí)候就可以傳入?yún)?shù)了虚汛。
CTime time(Hour ,Minute, Second )匾浪;//對象的定義
CTime(int Hour ,int Minute,int Second ) {
m_nHour=Hour; m_nMinute=Minute; m_nSecond=Second; }
在有了構(gòu)造函數(shù)之后,我們聲明時(shí)傳入?yún)?shù)調(diào)用的構(gòu)造函數(shù)等同于下面注釋的代碼卷哩。此時(shí)因?yàn)橐呀?jīng)沒有了默認(rèn)的構(gòu)造函數(shù)把将,就不能再想上一個(gè)章節(jié)那樣不傳入?yún)?shù)進(jìn)行對象的創(chuàng)建了倘是。
構(gòu)造函數(shù)的重載
在一個(gè)類中可以有多個(gè)構(gòu)造函數(shù),它們構(gòu)成了函數(shù)的重載。
下面兩個(gè)構(gòu)造函數(shù)構(gòu)成了重載癌蚁,我們可以在聲明對象的時(shí)候傳入不同的參數(shù)調(diào)用不同的構(gòu)造函數(shù)。此時(shí)可以依舊像上一個(gè)章節(jié)那樣對象不傳入任何參數(shù)过吻,也不需要再對它們一一初始化退腥,這一切都有構(gòu)造函數(shù)做了。對象在創(chuàng)建的時(shí)候會根據(jù)傳入?yún)?shù)的類型來調(diào)用不同的構(gòu)造函數(shù)栋齿,這和普通函數(shù)的調(diào)用是一致的苗胀。
這是一個(gè)含有默認(rèn)參數(shù)的構(gòu)造函數(shù),默認(rèn)參數(shù)的函數(shù)的使用和我們在函數(shù)那一章的規(guī)則是一樣的瓦堵。
中間的構(gòu)造函數(shù)的所有參數(shù)都有默認(rèn)值基协,這樣是不可以的,在有三個(gè)構(gòu)造函數(shù)的情況下菇用,我們創(chuàng)建一個(gè)沒有傳入?yún)?shù)的對象的時(shí)候澜驮,它是應(yīng)該調(diào)用第一個(gè)無參的默認(rèn)構(gòu)造函數(shù)吶?還是第二個(gè)符合默認(rèn)參數(shù)規(guī)則的構(gòu)造函數(shù)吶惋鸥?這樣就造成了二義性杂穷,是不可以的鹅龄。
析構(gòu)函數(shù)簡介
它的作用與構(gòu)造函數(shù)相反,一般是執(zhí)行對象的清理工作亭畜,當(dāng)對象的生命周期結(jié)束的時(shí)候扮休,會自動(dòng)的調(diào)用。析構(gòu)函數(shù)的作用并不是刪除對象拴鸵,在對象撤銷它所占用的內(nèi)存之前玷坠,做一些清理的工作。清理之后劲藐,這部分內(nèi)存就可以被系統(tǒng)回收再利用了八堡。在設(shè)計(jì)這個(gè)類的時(shí)候,系統(tǒng)也會默認(rèn)的提供一個(gè)析構(gòu)函數(shù)聘芜。在對象的生命周期結(jié)束的時(shí)候兄渺,程序就會自動(dòng)執(zhí)行析構(gòu)函數(shù)來完成這些工作。同構(gòu)造函數(shù)汰现,用戶自己定義挂谍,系統(tǒng)自動(dòng)調(diào)用。
1.析構(gòu)函數(shù)沒有返回值瞎饲,沒有參數(shù)口叙;
2.沒有參數(shù),所以不能重載嗅战,一個(gè)類僅有一個(gè)析構(gòu)函數(shù)妄田;
3.析構(gòu)函數(shù)除了釋放工作,還可以做一些用戶希望它做的一些工作驮捍,比如輸出一些信息疟呐。
它的命名規(guī)則如下:
~CTime();
定義如下:這個(gè)析構(gòu)函數(shù)為了顯示它在什么時(shí)候被調(diào)用,我們利用它輸出一句話以告知我們它被調(diào)用了东且。
運(yùn)行結(jié)果如下:我們在main函數(shù)里面創(chuàng)建了四個(gè)CTime對象启具,所以在退出main函數(shù)之后,四個(gè)對象的生命周期結(jié)束苇倡,析構(gòu)函數(shù)被調(diào)用了四次富纸。如果我們是在main函數(shù)的外面創(chuàng)建的對象囤踩,這個(gè)對象的銷毀是在我們退出程序之后旨椒。析構(gòu)函數(shù)銷毀對象的順序與構(gòu)建對象的順序是相反的。因?yàn)閷ο蟮拇鎯κ窃跅V械亩率瑮5奶匦跃褪窍冗M(jìn)后出综慎。
如果我們使用new運(yùn)算符來動(dòng)態(tài)的創(chuàng)建一個(gè)對象,這個(gè)對象是不會自動(dòng)被銷毀的勤庐,我們需要手動(dòng)使用delete銷毀示惊,這個(gè)時(shí)候析構(gòu)函數(shù)隨著delete的使用而被調(diào)用好港,在程序結(jié)束的時(shí)候就不會再銷毀這個(gè)對象了。
原文鏈接:http://www.maiziedu.com/wiki/cplus/structure/