溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++構(gòu)造函數(shù)的類型,淺拷貝與深拷貝實例分析

發(fā)布時間:2022-03-30 14:05:29 來源:億速云 閱讀:140 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“C++構(gòu)造函數(shù)的類型,淺拷貝與深拷貝實例分析”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“C++構(gòu)造函數(shù)的類型,淺拷貝與深拷貝實例分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

一、無參構(gòu)造函數(shù)

1.如果沒有定義構(gòu)造函數(shù),則系統(tǒ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òu)造函數(shù),前提是參數(shù)的個數(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ù)列表和初始化順序不可以變動

  • 變量名稱(不是參數(shù)列表名稱)一定要和成員變量名一樣

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

使用已經(jīng)創(chuàng)建好的同一類對象,進行構(gòu)造另一個對象。

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)類中有指針成員時,由系統(tǒng)默認(rèn)創(chuàng)建該復(fù)制構(gòu)造函數(shù)會存在風(fēng)險,具體原因請查詢有關(guān) “淺拷貝“

四、深拷貝和淺拷貝

淺拷貝,指的是在對象復(fù)制時,只對對象中的數(shù)據(jù)成員進行簡單的賦值,默認(rèn)拷貝構(gòu)造函數(shù)執(zhí)行的也是淺拷貝。

例如: person p2 = p1; 這就是淺拷貝,將p1中的成員變量值賦給p2,在這里其實就相當(dāng)于拷貝構(gòu)造函數(shù)的調(diào)用。

但是,淺拷貝,在成員變量是引用類型(指針)時,會出現(xiàn)問題。

  • 傳參問題中,地址傳遞后可以實現(xiàn)swap函數(shù)的調(diào)用,這就是淺拷貝的原理

  • 當(dāng)我們使用淺拷貝時,引用類型傳遞的依舊是地址,這也就是說,拷貝后的對象和拷貝的對象中引用對象指向同一塊地址,這樣就出現(xiàn)問題了。

在“深拷貝”的情況下,對于對象中動態(tài)成員,就不能僅僅簡單地賦值了,而應(yīng)該重新動態(tài)分配空間。

如果一個類擁有資源,當(dāng)這個類的對象發(fā)生復(fù)制過程的時候,資源重新分配,這個過程就是深拷貝。

上面提到,如果沒有自定義復(fù)制構(gòu)造函數(shù),則系統(tǒng)會創(chuàng)建默認(rèn)的復(fù)制構(gòu)造函數(shù),但系統(tǒng)創(chuàng)建的默認(rèn)復(fù)制構(gòu)造函數(shù)只會執(zhí)行“淺拷貝”,即將被拷貝對象的數(shù)據(jù)成員的值一一賦值給新創(chuàng)建的對象,若該類的數(shù)據(jù)成員中有指針成員,則會使得新的對象的指針?biāo)赶虻牡刂放c被拷貝對象的指針?biāo)赶虻牡刂废嗤琩elete該指針時則會導(dǎo)致兩次重復(fù)delete而出錯。

讀到這里,這篇“C++構(gòu)造函數(shù)的類型,淺拷貝與深拷貝實例分析”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI