拷貝建構函式作用:用乙個已存在的物件來初始化乙個正在建立的新物件。拷貝建構函式有以下特徵:
拷貝建構函式名與類名相同,形參只有乙個,是物件的引用,所以不能過載拷貝建構函式,拷貝建構函式原形為:《類名》(《類名》&物件名);
拷貝建構函式無任何函式返回型別說明;
若類宣告中無拷貝建構函式,系統會自動給出乙個預設的拷貝建構函式,該拷貝建構函式只進行物件資料成員間的對位拷貝,即所謂的「淺拷貝」;
某些情況下,使用者必須在類定義中給出乙個顯示的拷貝建構函式,以實現使用者指定的用乙個物件初始化另乙個物件的功能,即所謂的「深拷貝」;
以下三種情況,系統會自動呼叫拷貝建構函式:
(1)當使用下面的宣告語句,用乙個已存在的物件初始化乙個新物件時,系統會自動呼叫拷貝建構函式:
《類名》《新物件名》(《已存在物件名》);
或 《類名》《新物件名》=《已存在物件名》;
(2)物件作為實參,在函式呼叫開始進行實參和形參結合時,會自動呼叫拷貝建構函式,完成由已知的實參物件初始化形參新物件的功能;
(3)如果函式的返回值是類的物件,在函式呼叫完成返回時,系統自動呼叫拷貝建構函式,用return後面的已知物件來初始化乙個臨時新物件(所建立的臨時物件只在外部表示式範圍內有效,表示式結束時,系統將自動呼叫析構函式撤銷該臨時物件)。
**例如:**在主函式中需要用乙個已知的intarray類物件來初始化乙個新的intarray類物件,直接用系統提供的預設拷貝建構函式會出現問題(兩個物件指向乙個記憶體空間,系統**記憶體空間時會出現報錯)以及解決方法如下:
#include
using
namespace std;
class
intarray
intarray()
void
displayarraysize()
~intarray()
intarray
(intarray &x)
//拷貝建構函式
private
:int m_size;
int*m_ptr;
//整型指標在用之前需要給他分配乙個記憶體空間,分配記憶體空間之後把 分配記憶體空間首位址賦給m_ptr };
intmain()
關於上述程式的理解:
1、淺拷貝的記憶體空間只有乙個,在y中被析構函式銷毀後繼續釋放x的記憶體空間就會出現錯誤 。
2、如果乙個類中沒有指標成員變數的話,一般用淺拷貝就可以了,如果乙個類中有指標成員變數的話,一般需要定義乙個拷貝建構函式實現深拷貝 。
初遇建構函式
在翻劉汝佳的紫書的時候看見一種奇怪的結構體寫法 struct edge 這裡有兩個奇怪的東西 1.edge int u,int v,int d 結構體裡面套了乙個什麼玩意?2.from u to v dist d 這是什麼打法?問了下餘翱,第乙個是建構函式,可以在main裡面呼叫從而快速賦值。例如....
初遇C語言
壹 知識總結 第二章 c資料型別 1 int定義整數量 float定義單精度浮點數量 double定義雙精度浮點數量 char定義字元型量。2 讀程式都要從main 入口,然後從最上面順序往下讀 碰到迴圈做迴圈,碰到選擇做選擇 有且只有乙個main函式。3 注釋不可以巢狀,如int a 1,int ...
C 建構函式 拷貝建構函式
建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...