事實(shí)上任何一個(gè)類,在我們不寫(xiě)的情況下,都會(huì)自動(dòng)生成6個(gè)默認(rèn)的成員函數(shù)。
1.構(gòu)造函數(shù)概念:
構(gòu)造函數(shù)是一個(gè)特殊的成員函數(shù),名字與類名相同,實(shí)例化對(duì)象時(shí)由編譯器自動(dòng)調(diào)用,以此來(lái)保證每個(gè)數(shù)據(jù)成員都有一個(gè)合適的初始值,并且在對(duì)象的生命周期內(nèi)只調(diào)用一次。
構(gòu)造函數(shù)的主要作用是初始化對(duì)象,而不是開(kāi)辟空間創(chuàng)建對(duì)象。
特征:
1.函數(shù)名與類名相同
2.創(chuàng)建對(duì)象時(shí),由編譯器自動(dòng)調(diào)用,用戶無(wú)法調(diào)用
3.無(wú)返回值(void也不可以)
4.構(gòu)造函數(shù)可以重載
5.若類中沒(méi)有顯式定義構(gòu)造函數(shù),則編譯器會(huì)自動(dòng)生成一個(gè)無(wú)參的默認(rèn)構(gòu)造函數(shù);若用戶已顯式定義,則編譯器不再生成
6.無(wú)參和全缺省的構(gòu)造函數(shù)都稱為默認(rèn)構(gòu)造函數(shù),且默認(rèn)構(gòu)造函數(shù)只能有一個(gè)
例1:
例2:
例3:
2.析構(gòu)函數(shù)概念:
與構(gòu)造函數(shù)相反,析構(gòu)函數(shù)不是完成對(duì)象的銷毀,局部對(duì)象銷毀工作是由編譯器完成的,而對(duì)象在銷毀時(shí),會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),完成類的一些資源清理工作。
特性:
默認(rèn)的成員函數(shù),一定會(huì)生成?1.析構(gòu)函數(shù)名是在類名前加上一個(gè)字符‘~’。
2.沒(méi)有參數(shù)(可以加void,但一般不會(huì)這樣使用),沒(méi)有返回值。
3.一個(gè)類有且僅有一個(gè)析構(gòu)函數(shù)(不能重載)。若未顯式定義,系統(tǒng)則會(huì)自動(dòng)生成默認(rèn)的析構(gòu)函數(shù)。
4.對(duì)象生命周期結(jié)束時(shí),C++編譯系統(tǒng)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)。
從語(yǔ)法上來(lái)講,是一定會(huì)生成的,但是實(shí)際情況中并不一定。因?yàn)檎Z(yǔ)法是靠人來(lái)具體實(shí)現(xiàn)的,有時(shí)需要考慮一些其他因素,比如程序的運(yùn)行效率,所以有可能不會(huì)嚴(yán)格按照語(yǔ)法來(lái)實(shí)現(xiàn)。
? 比如一下代碼,并沒(méi)有什么意義,在某些編譯器及版本中(例:VS2013),就不會(huì)生成類的默認(rèn)成員函數(shù)。
3.拷貝構(gòu)造函數(shù)概念:
拷貝構(gòu)造函數(shù)只有單個(gè)形參,該形參是對(duì)本類類型對(duì)象的引用(一般常用const修飾,防止被修改),在用已存在的類類型對(duì)象創(chuàng)建新對(duì)象時(shí),由編譯器自動(dòng)調(diào)用。
特征:
1.拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的一個(gè)重載形式
2.拷貝構(gòu)造函數(shù)的參數(shù)只有一個(gè)且必須使用引用傳參,使用傳值方式會(huì)引發(fā)無(wú)窮遞歸調(diào)用
3.若未顯式定義,系統(tǒng)會(huì)生成默認(rèn)的拷貝構(gòu)造函數(shù)。
注意:默認(rèn)的拷貝構(gòu)造函數(shù)對(duì)象按內(nèi)存存儲(chǔ)按字節(jié)序完成拷貝,這種拷貝屬于淺拷貝,或叫值拷貝;所以沒(méi)有涉及到資源管理,可以直接使用默認(rèn)的拷貝構(gòu)造函數(shù)。
為什么拷貝構(gòu)造函數(shù)使用傳值方式會(huì)引發(fā)無(wú)窮遞歸?? 那我們就假設(shè)可以使用傳值方式,那么在調(diào)用拷貝構(gòu)造函數(shù)時(shí)就會(huì)發(fā)生臨時(shí)拷貝,需要將實(shí)參拷貝到形參中,即通過(guò)實(shí)參來(lái)構(gòu)造形參對(duì)象,那么此時(shí)就又需要調(diào)用拷貝構(gòu)造函數(shù),因此陷入無(wú)窮遞歸調(diào)用。
什么情況需要自實(shí)現(xiàn)拷貝構(gòu)造函數(shù)?? 因?yàn)槟J(rèn)的拷貝構(gòu)造函數(shù)采用的是淺拷貝,因此當(dāng)涉及到資源的管理時(shí),就需要自實(shí)現(xiàn)拷貝構(gòu)造函數(shù)。
調(diào)用拷貝構(gòu)造函數(shù)的場(chǎng)景(1)用一個(gè)對(duì)象直接構(gòu)造一個(gè)新對(duì)象
(2)類類型對(duì)象,以值的形式傳參
(3)類類型對(duì)象,以值的方式作為函數(shù)返回值
注意:若直接創(chuàng)建返回一個(gè)匿名對(duì)象,編譯器不會(huì)通過(guò)拷貝構(gòu)造函數(shù)創(chuàng)建一個(gè)臨時(shí)對(duì)象返回,而是直接將匿名對(duì)象返回。
4.賦值運(yùn)算符重載概念:
C++為了增強(qiáng)代碼的可讀性引入了運(yùn)算符重載,運(yùn)算符重載是具有特殊函數(shù)名的函數(shù),也具有其返回值類型、函數(shù)名,以及參數(shù)列表,其返回值類型與參數(shù)列表和普通的函數(shù)類似。
函數(shù)名:關(guān)鍵字operator后面接需要重載的運(yùn)算符符號(hào)
函數(shù)原型:返回值類型? operator操作符(參數(shù)列表)
注意:
什么情況需要自實(shí)現(xiàn)賦值運(yùn)算符重載?1.不能通過(guò)連接其他符號(hào)來(lái)創(chuàng)建新的操作符,比如operator@
2.重載操作符必須有一個(gè)類類型或者枚舉類型的操作數(shù)
3.用于內(nèi)置類型的操作符,其含義不能改變,例如:內(nèi)置的整型+,不能改變其含義
4.作為類成員的重載函數(shù)時(shí),其形參看起來(lái)比操作數(shù)數(shù)目少一,其實(shí)成員函數(shù)的操作符有一個(gè)默認(rèn)的形參this,限定為第一個(gè)參數(shù)
5.以下五個(gè)運(yùn)算符不能重載:.*、::、sizeof、?:、.
默認(rèn)的賦值運(yùn)算符重載,也是采用的淺拷貝,所以如果類中未涉及到資源管理時(shí),賦值操作是否顯示提供都可以,需要?jiǎng)t提供,不需要?jiǎng)t可不提供,利用編譯器完成賦值操作即可。
若類中涉及到資源管理,則用戶必須顯示實(shí)現(xiàn),否則編譯器默認(rèn)生成的賦值運(yùn)算符重載實(shí)現(xiàn)采用的是淺拷貝,可能造成資源、內(nèi)存泄漏,和多個(gè)對(duì)象共享同一份資源,在銷毀時(shí)造成代碼崩潰。
為什么賦值運(yùn)算符重載必須重載為類的成員函數(shù)?? 因?yàn)橘x值運(yùn)算符重載是類默認(rèn)的成員函數(shù),若用戶沒(méi)有顯示定義時(shí),編譯器會(huì)自動(dòng)生成一份,而此時(shí)若用戶自己再在類外實(shí)現(xiàn)一份,相等于存在兩個(gè)賦值運(yùn)算符重載形成歧義,編譯器則會(huì)報(bào)錯(cuò)。
較為標(biāo)準(zhǔn)的賦值運(yùn)算符重載(1)加返回值,支持連續(xù)賦值
類類型對(duì)象賦值,相當(dāng)于是調(diào)用賦值運(yùn)算符重載函數(shù),結(jié)合連續(xù)賦值的本質(zhì),所以需要對(duì)賦值運(yùn)算符重載函數(shù)加返回值。
(2)返回引用(前提不影響功能實(shí)現(xiàn)),提高效率
返回引用,則返回時(shí)不需要再調(diào)用拷貝構(gòu)造函數(shù)構(gòu)造臨時(shí)對(duì)象,提高程序效率。
(3)引用傳參,提高效率
(4)const修飾參數(shù),防止參數(shù)對(duì)象被修改
(5)添加檢驗(yàn),防止本身給本身賦值
實(shí)現(xiàn)重載前置++與后置++因?yàn)?+運(yùn)算符是單目運(yùn)算符,作為類的成員重載函數(shù),自帶了默認(rèn)的形參this,所以為了能夠?qū)崿F(xiàn)前置與后置++重載,在后置++重載函數(shù)中多加一個(gè)int形參作為區(qū)分。
注意:
后置++是先使用,再+1。所以需要先臨時(shí)保存對(duì)象,再對(duì)對(duì)象數(shù)據(jù)+1,然后返回的是+1前的臨時(shí)對(duì)象(即這里不可以返回引用)。
實(shí)現(xiàn)流提取運(yùn)算符<<重載若重載為類的成員函數(shù):
? 語(yǔ)法上是可以的,但是因?yàn)槠渥詭J(rèn)參數(shù)this,所以其使用邏輯為"對(duì)象名< <<重載規(guī)定: ? 第一個(gè)參數(shù)必須是ostream的對(duì)象,第二個(gè)參數(shù)才是要打印的內(nèi)容,所以一般重載為全局函數(shù)。 const修飾類的成員函數(shù): 將const修飾的類成員函數(shù)稱之為const成員函數(shù);const修飾類成員函數(shù),(本質(zhì))實(shí)際上修飾該成員函數(shù)隱藏的this指針,表明在該成員函數(shù)中不能對(duì)類的任何成員進(jìn)行修改。 例: 比如以下函數(shù),本意只是想對(duì)時(shí)間進(jìn)行一個(gè)打印輸出,但是在內(nèi)部可能不小心會(huì)對(duì)數(shù)據(jù)造成修改,影響功能實(shí)現(xiàn): this的類型:Time* const this 即this指針的指向不能修改,但是this指向?qū)ο笾械膬?nèi)容可以修改。 此時(shí)就可以通過(guò)const修飾該成員函數(shù),表明在該成員函數(shù)中不能對(duì)類的任何成員進(jìn)行修改。 this的類型:const Time* const this 即this指針的指向不能修改,指向?qū)ο笾械膬?nèi)容也不能修改。 (1)const對(duì)象能否調(diào)用非const成員函數(shù)? ? 不能,const類型對(duì)象只能調(diào)用const成員函數(shù),不能調(diào)用普通成員函數(shù)。因?yàn)槠胀ǔ蓡T函數(shù)可能會(huì)對(duì)對(duì)象中的成員進(jìn)行修改。 (2)非const對(duì)象能否調(diào)用const成員函數(shù)? ? 可以,普通對(duì)象對(duì)于普通成員函數(shù)和const成員函數(shù)都可以調(diào)用。 (3)const成員函數(shù)內(nèi),能否調(diào)用其他的非const成員函數(shù)? ? 不能,同理非const成員函數(shù)可能會(huì)對(duì)對(duì)象的成員進(jìn)行修改,而const成員函數(shù)內(nèi)不能對(duì)對(duì)象的任何成員進(jìn)行修改。 (4)非const成員函數(shù)內(nèi),能否調(diào)用其他的const成員函數(shù)? ? 可以。 注意: 構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),析構(gòu)函數(shù),賦值運(yùn)算符重載,不可以使用const修飾。因?yàn)橐陨纤膫€(gè)函數(shù)目的就是對(duì)成員進(jìn)行修改。 ? mutable關(guān)鍵字修飾成員變量,表示該成員變量可以在const修飾中被修改。 取地址操作符重載: const取地址操作符重載: 注意: 這兩個(gè)運(yùn)算符一般使用編譯器生成的默認(rèn)取地址重載成員函數(shù)即可,一般不需要自己實(shí)現(xiàn)重載。只有特殊情況才需要自己實(shí)現(xiàn),比如想要讓別人獲取指定的內(nèi)容等。 你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站欄目:C++程序設(shè)計(jì)——類的六個(gè)成員函數(shù)-創(chuàng)新互聯(lián)
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、外貿(mào)建站、用戶體驗(yàn)、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源:
創(chuàng)新互聯(lián)
相關(guān)問(wèn)題
文章地址:http://jinyejixie.com/article30/csojso.html
猜你還喜歡下面的內(nèi)容