C 有關拷貝建構函式(預設 淺 深拷貝建構函式)

2021-10-07 07:33:25 字數 1237 閱讀 1832

拷貝結構函式顧名思義就是複製物件。

先講一下預設拷貝函式:

預設拷貝就是直接賦值,讓程式呼叫預設拷貝結構函式。

student p1;

student p2 = p1//或者student p2(p1);

程式開始執行時,建立p1物件,p1物件的建構函式從堆中分配空間並賦給資料成員pname,執行,p2=p1時,因為沒有定義拷貝建構函式,於是就呼叫預設拷貝建構函式,

使得p2與p1完全一樣,並沒有新分配堆空間給p2,  p1與p2的pname都是同乙個值。析構p2時,將堆中字串清成空串,然後將堆空間返還給系統;

析構p1時,因為這是pname指向的是空串,所以第三行輸出中顯示的只是destructing,當執行 delete pname ; 按道理系統應該報錯,但在gcc中沒有。

重點講一下,深拷貝和淺拷貝。

#include #include class person 

}

// 系統建立的預設複製建構函式,只做位模式拷貝

person(person & p)

~person( )

private :

char * m_pname;};

void main( )

// 下面自己設計複製建構函式,實現「深拷貝」,即不讓指標指向同一位址,而是重新申請一塊記憶體給新的物件的指標資料成員

person(person & chs);

// 則新建立的物件的m_pname與原物件chs的m_pname不再指向同一位址了

}

因為編譯不同,可能不能通過編譯,但這不是重點。

直接利用淺拷貝,m_pname = p.m_pname,後者複製給前者,但資源(堆空間)並未複製給前者,相當於這兩個都同時指向同一位址,造成或釋放兩次記憶體。

深拷貝上面例子可以看到,會給它新申請乙個空間。

注意:(引用)「如果需要析構函式,則一定需要拷貝建構函式和賦值操作符。」

什麼情況使用複製建構函式:

類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式:

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

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

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

同時別人推薦的讀的文章:

想要了解跟多可以了解一下這篇文章:《物件導向進價--拷貝建構函式》

然後可以看下例子:多繼承的例子(附詳解)

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

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

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

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

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

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