C 複製建構函式

2021-06-05 16:15:43 字數 2281 閱讀 5858

c++複製建構函式,一般在一下幾種情況中出現

1:物件以值傳遞的方式傳入函式時

2:物件以值傳遞的的方式從函式返回

3:乙個物件通過另乙個物件初始化

4:陣列:根據陣列中的初始化列表初始化陣列的時候。

5:容器:初始化順序容器中的元素

有3種情況必須使用複製建構函式:

a:如果有資料成員是指標

b:要在建構函式中分配其它資源

c:在建立物件是必須做一些另外的工作

對3進行一些解釋:

如果乙個類中的成員變數有引用資料型別,這時候就要特別注意了,比如在建構函式中是new出來的,那麼在複製建構函式中最好還是要new。

下面是乙個例子,如果在複製建構函式中不new乙個陣列,那麼就要報錯(自己寫了釋放str的析構函式),這個例子如果在自己寫了析構函式來進行釋放str的記憶體,或則想實現深層複製,給str重新分配空間,而不是把位址直接賦值給str,也是必須使用預設建構函式的例子。

#include #include #include "deep_copy.h"

using namespace std;

class deepcopy

deepcopy(const deepcopy& dc):str(0)

~deepcopy()

void

show ()

;intmain()

執行程式,螢幕輸出100。從以上**的執行結果可以看出,系統為物件b分配了記憶體並完成了與物件a的複製過程。就類物件而言,相同型別的類物件是通過拷貝建構函式來完成整個複製過程的。下面舉例說明拷貝建構函式的工作過程。

#include 

<

iostream

>

using

namespace

std;

class

cexample 

cexample(

const

cexample&c)

void

show ()

;intmain()

cexample

(constcexample

& c)就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特殊的建構函式,函式的名稱必須和類名稱一致,它的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。例如:類x的拷貝建構函式的形式為x(x& x)。

當用乙個已初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式:

乙個物件以值傳遞的方式傳入函式體

乙個物件以值傳遞的方式從函式返回

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

如果在類中沒有顯式地宣告乙個拷貝建構函式,那麼,編譯器將會自動生成乙個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝。位拷貝又稱淺拷貝,後面將進行說明。

自定義拷貝建構函式是一種良好的程式設計風格,它可以阻止編譯器形成預設的拷貝建構函式,提高原始碼效率。

淺拷貝和深拷貝

在某些狀況下,類內成員變數需要動態開闢堆記憶體,如果實行位拷貝,也就是把物件裡的值完全複製給另乙個物件,如a=b。這時,如果b中有乙個成員變數指標已經申請了記憶體,那a中的那個成員變數也指向同一塊記憶體。這就出現了問題:當b把記憶體釋放了(如:析構),這時a內的指標就是野指標了,出現執行錯誤。

深拷貝和淺拷貝可以簡單理解為:如果乙個類擁有資源,當這個類的物件發生複製過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝。下面舉個深拷貝的例子。

#include

using namespace std;

class ca

ca(const ca& c)

void show()

深拷貝和淺拷貝的定義可以簡單理解成:如果乙個類擁有資源(堆,或者是其它系統資源),當這個類的物件發生複製過程的時候,這個過程就可以叫做深拷貝,反之物件存在資源,但複製過程並未複製資源的情況視為淺拷貝。

淺拷貝資源後在釋放資源的時候會產生資源歸屬不清的情況導致程式執行出錯。

test(test &c_t)是自定義的拷貝建構函式,拷貝建構函式的名稱必須與類名稱一致,函式的形式引數是本型別的乙個引用變數,且必須是引用。

當用乙個已經初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫,如果你沒有自定義拷貝建構函式的時候,系統將會提供給乙個預設的拷貝建構函式來完成這個過程,上面**的複製核心語句就是通過test(test &c_t)拷貝建構函式內的p1=c_t.p1;語句完成的。

C 複製建構函式

1.概念 只有單個形參,而且該形參是對本類型別物件的引用 常用const修飾 2.首先看乙個小例子 h中 class test private int a float b cpp中 int main test test1 5,5.5 test test2 1,1.1 coutcouttest3使用了...

C 複製建構函式

誰知道 include include using namespace std class person 如果兩種方式同時存在,會呼叫沒有const的版本 2.推薦,存在唯一的person person person person 3.不推薦,這個依然是複製建構函式,詭異。與第二種方法存在二義性 p...

複製建構函式(C )

複製建構函式定義 複製建構函式是一種特殊的建構函式,其形參為本類的物件引用。作用是用乙個已存在的物件去初始化同型別的新物件。class類名 類名 類 const 類名 物件名 複製建構函式的實現 複製建構函式被呼叫的三種情況 定義乙個物件時,以本類另 個物件作為初始值,發生複製構造 如果函式的形參是...