C 拷貝建構函式詳解

2021-09-08 06:35:52 字數 1474 閱讀 8643

很多時候在我們都不知道拷貝建構函式的情況下,傳遞物件給函式引數或者函式返回物件都能很好的進行,這是因為編譯器會給我們自動產生乙個拷貝建構函式,這就是「預設拷貝建構函式」,這個建構函式很簡單,僅僅使用「老物件」的資料成員的值對「新物件」的資料成員一一進行賦值。

拷貝建構函式沒有處理靜態資料成員。

比如乙個類裡有乙個靜態成員count,用來計算該類例項化物件的個數,如果使用預設拷貝建構函式的話,count的資料不會發生變化,所以這個時候,即當類裡有靜態成員的時候,要考慮自己編寫拷貝建構函式。

rect(const rect& r)   // 拷貝建構函式  

預設拷貝建構函式是淺拷貝,深拷貝和淺拷貝下面會講到。

以下情況都會呼叫拷貝建構函式:

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

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

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

可見,拷貝建構函式是一種特殊的建構函式,函式的名稱必須和類名稱一致,它的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。

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

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

//全域性函式,傳入的是物件  

void g_fun(cexample c)  

當g_fun()函式執行到return時,會產生以下幾個重要步驟:

(1). 先會產生乙個臨時變數,就叫***x吧。

(2). 然後呼叫拷貝建構函式把temp的值給***x。整個這兩個步驟有點像:cexample ***x(temp);

(3). 在函式執行到最後先析構temp區域性變數。

(4). 等g_fun()執行完後再析構掉***x物件。 

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

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

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

四.三法則(英語:rule of three,the law of the big three,the big three;三法則,三大定律)在 c++ 程式設計裡,它是乙個以設計的基本原則而制定的定律,三法則的要求在於,假如型別有明顯地定義下列其中乙個成員函式,那麼程式設計師必須連其他二個成員函式也一同編寫至型別內,亦即下列三個成員函式缺一不可。 [1]:

析構函式(destructor)

複製建構函式(copy constructor)

複製賦值運算子(copy assignment operator)

C 拷貝建構函式詳解

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

C 拷貝建構函式詳解

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

C 拷貝建構函式詳解

一.什麼是拷貝建構函式 首先對於普通型別的物件來說,它們之間的複製是很簡單的,例如 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。執行程式,螢幕輸出100。從以上 的執行結果可以看出,系統為物件 b 分配了記憶體並完成了與 物件 a 的複製過程...