C++構(gòu)造函數(shù)的類型,淺拷貝與深拷貝詳解
一、無參構(gòu)造函數(shù)
1.如果沒有定義構(gòu)造函數(shù),則系統(tǒng)自動(dòng)調(diào)用此默認(rèn)構(gòu)造函數(shù),且什么都不做。
2.如果用戶自定義了帶參數(shù)的構(gòu)造函數(shù),若還想調(diào)用無參的構(gòu)造函數(shù),必須顯示定義
person() { cout << "this object is being created." << endl; }
二、含參構(gòu)造函數(shù)
一般構(gòu)造函數(shù)可以有各種參數(shù)形式,一個(gè)類可以有多個(gè)一般構(gòu)造函數(shù),前提是參數(shù)的個(gè)數(shù)或者類型不同(基于c++的重載函數(shù)原理)
person(string ID, int age, int height, string sex) { cout<<"含參構(gòu)造函數(shù)調(diào)用"<< endl; this.ID = ID; this.age = age; this.height = height; this.sex = sex; }
含參的構(gòu)造函數(shù)還可以使用快速初始化的方法:
person(string ID, int age, int height, string sex) : ID(ID), age(age), height(height), sex(sex) { }
注意:
- 初始化參數(shù)列表和初始化順序不可以變動(dòng)
- 變量名稱(不是參數(shù)列表名稱)一定要和成員變量名一樣
三、拷貝構(gòu)造函數(shù)
使用已經(jīng)創(chuàng)建好的同一類對(duì)象,進(jìn)行構(gòu)造另一個(gè)對(duì)象。
person(const person &p) { cout << "拷貝構(gòu)造函數(shù)調(diào)用" << endl; this->ID = p.ID; this->age = p.age; this->height = p.height; this->sex = p.sex; }
注意:
但當(dāng)類中有指針成員時(shí),由系統(tǒng)默認(rèn)創(chuàng)建該復(fù)制構(gòu)造函數(shù)會(huì)存在風(fēng)險(xiǎn),具體原因請(qǐng)查詢有關(guān) “淺拷貝“
四、深拷貝和淺拷貝
淺拷貝,指的是在對(duì)象復(fù)制時(shí),只對(duì)對(duì)象中的數(shù)據(jù)成員進(jìn)行簡單的賦值,默認(rèn)拷貝構(gòu)造函數(shù)執(zhí)行的也是淺拷貝。
例如: person p2 = p1; 這就是淺拷貝,將p1中的成員變量值賦給p2,在這里其實(shí)就相當(dāng)于拷貝構(gòu)造函數(shù)的調(diào)用。
但是,淺拷貝,在成員變量是引用類型(指針)時(shí),會(huì)出現(xiàn)問題。
- 傳參問題中,地址傳遞后可以實(shí)現(xiàn)swap函數(shù)的調(diào)用,這就是淺拷貝的原理
- 當(dāng)我們使用淺拷貝時(shí),引用類型傳遞的依舊是地址,這也就是說,拷貝后的對(duì)象和拷貝的對(duì)象中引用對(duì)象指向同一塊地址,這樣就出現(xiàn)問題了。
在“深拷貝”的情況下,對(duì)于對(duì)象中動(dòng)態(tài)成員,就不能僅僅簡單地賦值了,而應(yīng)該重新動(dòng)態(tài)分配空間。
如果一個(gè)類擁有資源,當(dāng)這個(gè)類的對(duì)象發(fā)生復(fù)制過程的時(shí)候,資源重新分配,這個(gè)過程就是深拷貝。
上面提到,如果沒有自定義復(fù)制構(gòu)造函數(shù),則系統(tǒng)會(huì)創(chuàng)建默認(rèn)的復(fù)制構(gòu)造函數(shù),但系統(tǒng)創(chuàng)建的默認(rèn)復(fù)制構(gòu)造函數(shù)只會(huì)執(zhí)行“淺拷貝”,即將被拷貝對(duì)象的數(shù)據(jù)成員的值一一賦值給新創(chuàng)建的對(duì)象,若該類的數(shù)據(jù)成員中有指針成員,則會(huì)使得新的對(duì)象的指針?biāo)赶虻牡刂放c被拷貝對(duì)象的指針?biāo)赶虻牡刂废嗤?,delete該指針時(shí)則會(huì)導(dǎo)致兩次重復(fù)delete而出錯(cuò)。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
深入詳解C編寫Windows服務(wù)程序的五個(gè)步驟
本篇文章介紹了,使用C編寫Windows服務(wù)程序的五個(gè)步驟的詳細(xì)概述。需要的朋友參考下2013-05-05如何為Qt視圖中的文字實(shí)現(xiàn)彩虹漸變效果
這篇文章主要給大家介紹了關(guān)于如何為Qt視圖中的文字實(shí)現(xiàn)彩虹漸變效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Qt具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03C++實(shí)現(xiàn)LeetCode(172.求階乘末尾零的個(gè)數(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(172.求階乘末尾零的個(gè)數(shù)),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08類成員函數(shù)的重載、覆蓋與隱藏之間的區(qū)別總結(jié)
以下是對(duì)類成員函數(shù)的重載、覆蓋與隱藏之間的區(qū)別進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友可以過來參考下。希望對(duì)大家有所幫助2013-10-10一文搞懂C語言static關(guān)鍵字的三個(gè)作用
這篇文章主要介紹了C語言static關(guān)鍵字的三個(gè)作用,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04C語言編程中借助pthreads庫進(jìn)行多線程編程的示例
這篇文章主要介紹了C語言編程中借助pthreads庫進(jìn)行多線程編程的示例,文中的示例環(huán)境為Windows系統(tǒng),需要的朋友可以參考下2015-11-11C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法
這篇文章主要介紹了C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法,結(jié)合具體實(shí)例形式分析了C++多重調(diào)用中的重復(fù)調(diào)用問題及相應(yīng)的解決方法,需要的朋友可以參考下2018-05-05