拷貝結構函式顧名思義就是複製物件。
先講一下預設拷貝函式:
預設拷貝就是直接賦值,讓程式呼叫預設拷貝結構函式。
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...