国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用)

這篇具有很好參考價值的文章主要介紹了【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?????個人主頁:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
???系列專欄:

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

?文章來源地址http://www.zghlxwxcb.cn/news/detail-831971.html

目錄

類的6個默認(rèn)成員函數(shù)

構(gòu)造函數(shù)

特性

?析構(gòu)函數(shù)

特性

?析構(gòu)的順序

拷貝構(gòu)造函數(shù)

特性

常引用


前言

?????? hello! 各位鐵子們大家好哇。

? ? ? ? ? ? ?今日更新了類與對象的構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用的內(nèi)容
?????? 歡迎大家關(guān)注??點贊??收藏??留言??

類的6個默認(rèn)成員函數(shù)

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

如果一個類中什么成員都沒有,簡稱為空類。?其實,任何類在什么都不寫時,編譯器會自動生成6個默認(rèn)成員函數(shù)。

默認(rèn)成員函數(shù):用戶沒有顯式實現(xiàn),編譯器會生成的成員函數(shù)稱為默認(rèn)成員函數(shù)。

構(gòu)造函數(shù)

  • 構(gòu)造函數(shù)是一個特殊的成員函數(shù),名字與類名相同,創(chuàng)建類類型對象時由編譯器自動調(diào)用,在對象整個生命周期內(nèi)只調(diào)用一次。
  • 構(gòu)造函數(shù)是特殊的成員函數(shù),需要注意的是,構(gòu)造函數(shù)雖然名稱叫構(gòu)造,但是構(gòu)造函數(shù)的主要任務(wù)并不是開空間創(chuàng)建對象,而是初始化對象。

特性

  1. 函數(shù)名與類名相同。
  2. 無返回值。(不是void,不需要寫)
  3. 對象實例化時編譯器自動調(diào)用對應(yīng)的構(gòu)造函數(shù)。
  4. 構(gòu)造函數(shù)可以重載。

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

注意:如果通過無參構(gòu)造函數(shù)創(chuàng)建對象時,對象后面不用跟括號,否則就成了函數(shù)聲明。

C++把類型分成內(nèi)置類型(基本類型)和自定義類型:

內(nèi)置類型就是語言提供的數(shù)據(jù)類型,如:int/char...

自定義類型就是class/struct/union等自己定義的類型,

  • ?默認(rèn)生成的構(gòu)造函數(shù),對于內(nèi)置類型不做處理,自定義類型會去調(diào)用他的默認(rèn)構(gòu)造。
  • C++11 打了補丁,即:內(nèi)置類型成員變量在類中聲明時可以給缺省值。
  • 如果我們沒寫任何一個構(gòu)造函數(shù),編譯器才會自動生成無參的默認(rèn)構(gòu)造函數(shù),如果寫了,就不會生成
  • 無參的構(gòu)造函數(shù)全缺省的構(gòu)造函數(shù)都稱為默認(rèn)構(gòu)造函數(shù),并且默認(rèn)構(gòu)造函數(shù)只能有一個。 注意:無參構(gòu)造函數(shù)、全缺省構(gòu)造函數(shù)、我們沒寫編譯器默認(rèn)生成的構(gòu)造函數(shù),都可以認(rèn)為 是默認(rèn)構(gòu)造函數(shù)。(默認(rèn)構(gòu)造函數(shù)有3個)
    【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言?

如上圖,顯示沒有合適的默認(rèn)構(gòu)造函數(shù)可用。因為類中有構(gòu)造函數(shù),所以編譯器不會再生成。又因為它只是帶參數(shù)的,并不是全缺省或者無參的,所以不是默認(rèn)構(gòu)造函數(shù),因此發(fā)生錯誤。

?析構(gòu)函數(shù)

析構(gòu)函數(shù):與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對對象本身的銷毀,局部對象銷毀工作是由 編譯器完成的。而對象在銷毀時會自動調(diào)用析構(gòu)函數(shù),完成對象中資源的清理工作。

特性

  1. 析構(gòu)函數(shù)名是在類名前加上字符 ~。
  2. 無參數(shù)無返回值類型
  3. 一個類只能有一個析構(gòu)函數(shù)。若未顯式定義,系統(tǒng)會自動生成默認(rèn)的析構(gòu)函數(shù)。注意:析構(gòu) 函數(shù)不能重載
  4. 對象生命周期結(jié)束時,C++編譯系統(tǒng)系統(tǒng)自動調(diào)用析構(gòu)函數(shù)
  5. 編譯器生成的默認(rèn)析構(gòu)函數(shù),對自定類型成員調(diào)用它的析構(gòu)函數(shù),對內(nèi)置類型不做處理。
  6. 如果類中沒有申請資源時,析構(gòu)函數(shù)可以不寫,直接使用編譯器生成的默認(rèn)析構(gòu)函數(shù),比如Date類;有資源申請時,一定要寫,否則會造成資源泄漏,比如Stack類。

?析構(gòu)的順序

下面是例題:

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

?分析:析構(gòu)的順序是2、1、3。因為d1,d2是main函數(shù)里的局部對象,存儲在棧內(nèi),要符合后進先出,所以先析構(gòu)d2,然后再析構(gòu)d1。而d3是靜態(tài)的局部對象,存儲在另一個單獨的區(qū)域,在main函數(shù)結(jié)束后析構(gòu),最終順序就是2,1,3。

變式:

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

分析:func函數(shù)中d3是局部的,d4是局部的靜態(tài)。func函數(shù)結(jié)束后,析構(gòu)d3,接著析構(gòu)d2,d1,最后才是d4.

變式:

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

析構(gòu)順序規(guī)律:局部對象(后定義先析構(gòu))--》局部的靜態(tài)--》全局對象(后定義先析構(gòu))
?


【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

問題:在main方法中根本沒有直接創(chuàng)建Time類的對象,為什么最后會調(diào)用Time類的析構(gòu)函數(shù)??

分析: main中創(chuàng)建了Date對象d,d中有Time類的_t。d銷毀時,要將_t對象銷毀,就要調(diào)用Time類的析構(gòu)函數(shù)。因為不能直接調(diào)用Time類的析構(gòu)函數(shù),編譯器會調(diào)用Date類的析構(gòu)函數(shù),由于沒有顯示的寫出來,編譯器會生成默認(rèn)的析構(gòu)函數(shù),然后在內(nèi)部調(diào)用Time類的析構(gòu)函數(shù)。

拷貝構(gòu)造函數(shù)

拷貝構(gòu)造函數(shù):只有單個形參,該形參是對本類類型對象的引用(一般常用const修飾),在用已存 在的類類型對象創(chuàng)建新對象時由編譯器自動調(diào)用。

特性

  1. 拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的一個重載形式。
  2. 拷貝構(gòu)造函數(shù)的參數(shù)只有一個且必須是類類型對象的引用,使用傳值方式編譯器直接報錯, 因為會引發(fā)無窮遞歸調(diào)用。
  3. 若未顯式定義,編譯器會生成默認(rèn)的拷貝構(gòu)造函數(shù)。 默認(rèn)的拷貝構(gòu)造函數(shù)對內(nèi)置類型完成拷貝,這種拷貝叫做淺拷貝,或者值拷貝。而自定義類型是調(diào)用其拷貝構(gòu)造函數(shù)完成拷貝的。
  4. 類中如果沒有涉及資源申請時,拷貝構(gòu)造函數(shù)是否寫都可以;一旦涉及到資源申請 時,則拷貝構(gòu)造函數(shù)是一定要寫的,否則就是淺拷貝。

C++規(guī)定自定義的類型都會調(diào)用拷貝構(gòu)造。?

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

?注意:拷貝構(gòu)造時要傳引用,不能傳值。如果傳值,根據(jù)C++規(guī)定,會調(diào)用拷貝構(gòu)造,這樣就會無窮遞歸下去,發(fā)生錯誤。


【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

分析:在調(diào)用func1時要傳值傳參,就會先調(diào)用拷貝構(gòu)造,然后才能調(diào)用func1。


【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

運行時發(fā)生錯誤,顯示沒有默認(rèn)構(gòu)造函數(shù)可用。因為Time類中已經(jīng)有拷貝構(gòu)造函數(shù)了,而拷貝構(gòu)造也是構(gòu)造函數(shù),所以編譯器不會再生成默認(rèn)默認(rèn)構(gòu)造函數(shù),這時就需要我們自己寫出構(gòu)造函數(shù)。注釋的第二行是強制編譯器生成默認(rèn)構(gòu)造函數(shù)。


?【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

上面的代碼運行后會崩潰。 類中只有內(nèi)置類型,沒有顯式寫出拷貝構(gòu)造函數(shù),編譯器會給出默認(rèn)的拷貝構(gòu)造函數(shù),進行淺拷貝。在數(shù)組中他們的內(nèi)容是一樣的,s1和s2的數(shù)組指向同一空間,當(dāng)s2析構(gòu)后,公用的空間已經(jīng)被銷毀了,這時s1又再銷毀一次,程序就崩潰了。

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言?解決方法如下:

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

進行深拷貝(即重新再開空間),我們自己寫出拷貝構(gòu)造函數(shù)即可。?

常引用

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言?

b是a的別名,修改b時,a也會跟著改變。如果傳參時想要改變外面的,就要傳引用,但如果不想改變外面的,就需要用const引用。const引用是別名但是不能修改,即權(quán)限的縮小。a是可讀可寫的,而c只是可讀的。?

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言?

?x是只可讀,而y是可讀可寫的,不能放大權(quán)限。解決方法是在int& y前面加上const。

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言?

10是常量,z要用常引用。a+x的表達(dá)式返回值是臨時對象,臨時對象具有常性,也要用常引用。?

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言?

?如果我們只是想傳值過去,建議用const引用。因為如果直接用引用,我們將不能直接傳常量過去。

【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用),C++,c++,開發(fā)語言,c語言

d可以給i,但是d不能給int& ri。d給i中間會有類型轉(zhuǎn)換,類型轉(zhuǎn)換時會有臨時對象產(chǎn)生,也就是把d的臨時對象給i。而d給int& ri也是,中間有類型轉(zhuǎn)換,會有臨時對象產(chǎn)生,臨時對象有常性,因此要用const引用。?

?

到了這里,關(guān)于【C++】類與對象(構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、常引用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包