C 學習筆記之建構函式(三)拷貝(複製)建構函式

2022-04-29 14:03:06 字數 1116 閱讀 8310

定義:使用類的乙個物件來構造和初始化另乙個物件,這另乙個物件之前是不存在的。

要注意理解拷貝(複製)和賦值的區別,拷貝和複製時另乙個物件之前是不存在的,而賦值是兩個物件都構造好了。

如:a a;   a b(a);  a b = a;   這是拷貝

a a;   a b;  b = a;這是賦值

拷貝建構函式的過載宣告如下:

a(const a& other)

舉例:class a

private:

int m_i;

public:

a()a(const a&other):m_i(other.m_i)

在c++中,下列三種情況下物件需要呼叫拷貝建構函式:

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

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

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

如果在前兩種情況下不使用拷貝建構函式,就會導致乙個指標指向已經被刪除的記憶體空間(這句話尚未完全理解,待詳解)。

淺拷貝與深拷貝

如果乙個類擁有資源(比如指標),在這個類的物件發生拷貝的時候,如果沒有重新分配資源,就是淺拷貝;如果重新分配了資源,就是深拷貝。什麼意思呢,舉個例子:

class array

array(const array& other)

};int main()

array arr1;

array arr2 = arr1; //呼叫拷貝建構函式

return 0;

上述**就是乙個淺拷貝,但存在什麼問題呢,array的拷貝建構函式沒有給拷貝物件重新分配記憶體,arr1.m_parr和arr2.m_parr指向的是同一塊記憶體,當arr1被析構時,arr1.m_parr指向的記憶體就被釋放了,這時arr2.m_parr指向的記憶體就不存在了,相應的arr2.m_parr就變成了野指標。在實際的程式設計設計中要避免淺拷貝,使用深拷貝。什麼是深拷貝呢,改變上面**的拷貝建構函式如下:

array(const array& other)

m_icount = other.m_icount;

m_parr = new int[m_icount];

for(int i=0;im_parr[i] = other.m_parr[i];

C 之 拷貝建構函式 即複製建構函式

主要探索淺拷貝和深拷貝 拷貝建構函式是一種特殊的建構函式,函式的名稱必須和類名稱一致,它的唯一的乙個引數是本型別的乙個引用變數。當出現類的等號賦值時,會呼叫拷貝函式 在未定義顯示拷貝建構函式的情況下,系統會呼叫預設的拷貝函式 即淺拷貝,它能夠完成成員的一一複製。當資料成員中沒有指標時,淺拷貝是可行的...

c 複製 拷貝建構函式

在c 中,定義乙個空類時,編譯器會預設宣告6個成員函式,它們分別是 class empty 注意 一下,編譯器預設合成的析構函式不是虛函式。首先,說一下什麼是拷貝建構函式 也可以叫複製建構函式 它是乙個特殊的建構函式,具有單個形參 此形參是對該類型別的引用,需要用const修飾,否則會無限迴圈呼叫複...

c 拷貝(複製)建構函式

class line line line const line obj 拷貝建構函式是一種特殊的建構函式,它在建立物件時,是使用同一類中之前建立的物件來初始化新建立的物件。拷貝建構函式通常用於 1 通過使用另乙個同型別的物件來初始化新建立的物件,即用已有物件給新建立物件賦值。line line1 1...