定義:使用類的乙個物件來構造和初始化另乙個物件,這另乙個物件之前是不存在的。
要注意理解拷貝(複製)和賦值的區別,拷貝和複製時另乙個物件之前是不存在的,而賦值是兩個物件都構造好了。
如: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...