C 之淺拷貝和深拷貝

2021-08-27 00:14:01 字數 1342 閱讀 9039

如果是乙個類,裡面沒有指標的成員變數,那麼深拷貝與淺拷貝沒有什麼區別,但是有了指標,情況就變了

#include 

using

namespace

std;

class person

int age;

};int main()

輸出結果是:

20

20------------

1020

可以看出,p1中age修改了,但是沒有修改p2中的age,說明,p1和p2中的age指向的位址不一樣。

#include 

#include

using

namespace

std;

class person

int age;

};int main()

執行結果是:

10 zhang

20 zhang

10 li

20 li

這裡就感覺到了奇怪了,修改了p1的name,為什麼p2中的name也一起修改了。那麼p2和p1指向的同乙個位址,使用p2中的namep1中的name是乙個區域。這是因為,我們沒有給person類寫拷貝建構函式,那麼我們使用person p2 = p1;這條語句的時候,編譯器會生成預設的拷貝建構函式,變數name就指向同乙個位址。

同樣以上面類為例子,現在新增乙個拷貝建構函式,就可以避免這種問題了。

#include 

#include

using

namespace

std;

class person

person(const person& p)

int age;

};int main()

執行結果:

10 zhang

20 zhang

10 li

20 zhang

現在我們可以看出,在拷貝建構函式裡面,我們手動為每個成員變數賦值,age和name。使用p1和p2中的name成員變數就是指向不同區域,所以修改p1中的name,不會修改p2中的name。

如果我們定義的類中有指標,那麼我們需要寫乙個拷貝建構函式,避免出現淺拷貝。

c 之深拷貝和淺拷貝

淺拷貝 簡單的賦值拷貝操作。深拷貝 在堆區重新申請空間,進行拷貝操作。includeusing namespace std class person person int age,int height person const person p person cout person析構函式 void...

C 之深拷貝 淺拷貝

關於拷貝的錯誤 對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。以下有乙個學生類 執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,這會導致什麼問題呢?name指標被分配一次記憶體,但是程式結...

C 之深拷貝 淺拷貝

什麼是拷貝建構函式?通過拷貝物件的方式建立乙個新的物件,拷貝建構函式的引數必須是類物件的引用,也就是將乙個物件拷貝給另乙個新建的物件 用途,在建立物件的時候,使用同一類之前建立的物件來初始化新建立的物件 book book b 必須是引用的原因是,如果是傳值方式將實參傳遞給形參,中間要經歷乙個物件的...