C 深拷貝和淺拷貝

2021-08-02 10:26:16 字數 2126 閱讀 3105

物件的拷貝:

普通型別的物件拷貝:

int ntest = 88;

int ntest1 = ntest;

int ntest2( ntest );

類物件的拷貝:

對於類物件的拷貝來說,相同型別的類物件使通過拷貝建構函式來實現的。物件的拷貝分為淺拷貝和深拷貝。

拷貝建構函式:

拷貝建構函式的名稱必須和類名稱一致,引數只有乙個本型別的引用變數,該引數必須是const型別,用來確保該引數物件再拷貝建構函式內不能被改變。

拷貝建構函式格式如下:

ctest( const ctest& cvalue){}

當物件需要被拷貝時,就會呼叫拷貝建構函式,如果這個類中沒有生命拷貝建構函式的話,編輯器會生成乙個預設拷貝建構函式,該預設拷貝建構函式完成物件之間的淺拷貝。

會呼叫拷貝建構函式的情況:

物件以值傳遞的方式傳入函式體內。

物件以值傳遞的方式從函式中返回。

物件需要通過另外乙個物件進行初始化。

淺拷貝和深拷貝:

淺拷貝:

直接為資料成員賦值即可。

如果類物件中有指標型別的成員,但是沒有分配專門的記憶體,這時候淺拷貝是會帶來問題的。

**如下:

cshallowreplication.h檔案中

#include 

// 淺拷貝

class cshallowrep

void show( )

void setname( char* pvalue )

void setage( int nvalue )

public:

char* pname;

int nage;

};

main.cpp檔案中

#include 

#include

using

namespace

std;

#include "shallowreplication.h"

#include "deepreplication.h"

void main()

在啟動程式的時候會有報錯:

根據報錯資訊可以知道。程式試圖將」xiaoming」拷貝到pname指向的位置,而pname指向的位置並不是經過系統分配來的,是隨機的位址值,pname是乙個野指標。這種行為是不被接受的。

深拷貝:

在建構函式中,為指標型別的成員,分配專門的記憶體。

在類的物件發生拷貝過程的時候,資源重新分配了,則這個過程就是深拷貝。

**如下:

cdeepreplication.h檔案中

#include 

// 深拷貝

class cdeeprep

cdeeprep(const cdeeprep& rdeeprep)

~cdeeprep()

void show( )

void setname( char* pvalue )

void setage( int nvalue )

public:

char* pname;

int nage;

};

main.cpp檔案中

#include 

#include

using

namespace

std;

#include "shallowreplication.h"

#include "deepreplication.h"

void main()

執行結果如下:

C 淺拷貝和深拷貝

class test test const test t val new int t.val test private int val 現在定義兩個物件,test t1 9 test t2 t1 如果你不提供copy建構函式 注釋掉的那個 那麼t1和t2的成員 val指向同乙個物件,當析構的時候,同...

c 深拷貝和淺拷貝

深拷貝和淺拷貝 ca const ca c 就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特別的建構函式,函式的名稱必須和類名稱一致,他的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。例如 類x的拷貝建構函式的形式為x x x 當用乙個已初始化過了的自定義類型別物件...

c 深拷貝和淺拷貝

對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。iostream using namespace std class cexample void show ...