C 關於建構函式的深拷貝與淺拷貝

2022-05-05 05:42:07 字數 909 閱讀 8032

首先拷貝建構函式的宣告方法:

類名::類名(const 類名&)

1、淺拷貝的實現程式:

#include "stdafx.h"

#include #include using namespace std;

class person

//析構函式

~person()

//類person的拷貝建構函式

person(const person &person)

private:

char *pname;

double height;

double weight;

int age;

};int main()

首先這個程式在vs2013上面編譯不通過;是因為淺拷貝存在風險:非法操作記憶體,究其原因是因為「拷貝不充分」導致堆中的某一塊記憶體被不同物件的指標屬性同時指向,該記憶體不可避免的被釋放多次,這是不應許。第一次被釋放的空間已經屬於作業系統,當在一次釋放時那一片空間已經不屬於程式了。

以下是淺拷貝的記憶體模型:

2、深拷貝可以避免由於淺拷貝帶來的問題,即讓拷貝函式做好充分的拷貝,程式如下:

#include "stdafx.h"

#include using namespace std;

class person

//析構函式

~person()

//類person的拷貝建構函式

person(const person &person)

private:

char *pname;

double height;

double weight;

int age;

};int main()

深拷貝的記憶體模型:

C 拷貝建構函式 深拷貝與淺拷貝

深拷貝函式主要是解決拷貝函式不能直接拷貝指標所指記憶體的資料的問題 其次,介紹一下什麼是拷貝建構函式以及拷貝建構函式將在何時被呼叫?拷貝建構函式是一種特殊的建構函式,其形參是本類物件的引用,其作用是使用乙個已經存在的物件來初始化 乙個新的同類的物件。何時被呼叫?當用類的物件去初始化另外乙個物件的時候...

C 淺拷貝與深拷貝建構函式

include using namespace std 淺拷貝和深拷貝區別 1.淺拷貝,若類中不存在拷貝建構函式,會提供預設拷貝建構函式 淺拷貝 可以進行物件值賦值 但當資料成員中存在需要在堆區申請空間時,析構時淺拷貝會造成空間雙重釋放問題 2.深拷貝,當資料成員中存在需要在堆區申請空間時,會呼叫深...

C 拷貝建構函式的深拷貝與淺拷貝

一 什麼時候呼叫拷貝建構函式 如果在類中沒有顯式地宣告乙個拷貝建構函式,那麼,編譯器將會自動生成乙個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝。位拷貝又稱淺拷貝。二 深拷貝和淺拷貝的區別 1.在未定義顯示拷貝建構函式的情況下,系統會呼叫預設的拷貝建構函式 即淺拷貝。當資料成員中沒有指標時,淺...