建構函式
/複製構
造函式/析構函式/賦值操作符這幾個概念是c++中乙個類裡面的幾個基本函式,作為初學者的我對這幾個概念比較生疏,對其用法也有些疑問,下面對這幾個基本的函式進行總結。這裡主要說明他們的含義以及何時需要使用者自己定義(和預設的有啥區別)。
建構函式:
建構函式是特殊的成員函式,只要建立類型別的新物件,都要執行建構函式。建構函式的工作是保證每個物件的資料成員具有合適的初始值。建構函式需要注意幾點,一是建構函式可以被過載,由實參決定使用哪個建構函式,二是對於const物件,const建構函式是不必要的。建立類型別的const物件時,執行乙個普通建構函式來初始化該const物件。建構函式的工作是初始化物件。不管物件是否為const,都用乙個建構函式來初始化該物件。(c++ primer)
一般情況下,在使用者需要對物件初始化進行控制的時候,會定義自己的建構函式,這個時候,編譯器不會再生成預設建構函式。這條規則的根據是,如果乙個類在某種情況下需要控制物件初始化,則該類很可能在所有情況下都需要控制。(c++ primer)
除了編譯器預設的建構函式,通常情況下類定義乙個預設建構函式,使用者可以使用這個預設的建構函式進行初始化。
複製建構函式:
複製建構函式主要用於控制複製某型別的物件時會發生什麼,它是一種特殊的建構函式,具有單個形參,該形參是該類型別的引用。當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯示使用複製建構函式。當將該型別的物件傳遞給函式或返回該型別的物件時,將隱式地呼叫複製建構函式。
同建構函式一樣,複製建構函式有編譯器合成的複製建構函式,也可以定義自己的複製建構函式。何時需要定義自己的複製建構函式是乙個難點。一般而言,只包含類型別成員或內建型別(不是指標型別)成員的類,無須顯式地定義複製建構函式,也可以複製。
有些類必須對複製物件時發生的事情加以控制。這樣的類經常有乙個資料成員是指標,或者有成員表示在類中需要分配資源。這種情況下,系統合成的複製建構函式往往只是給這個指標變數分配了記憶體,但是沒有對指標所指向的物件(乙個字串,另外乙個類)分配資源,使用系統合成的複製建構函式往往達不到程式設計師的意圖。舉兩個需要自己定義合成複製函式的例子:
1、matrix類,其中,實際矩陣在建構函式中動態分配,在析構函式中刪除。
2、payroll類,這個類中為每個物件提供唯一id。
第乙個涉及記憶體的動態分配,當用已有的物件生成乙個新物件時,複製建構函式必須為這個新物件動態分配記憶體,而系統預設的合成複製建構函式並沒有這個功能,所以需要定義自己的複製建構函式。
第二個需要為每個物件提供唯一id,利用已知的物件使用複製建構函式生成新物件時,系統預設的合成複製建構函式會一併地複製這個id,使得新物件的id和原物件的id是一樣的,所以需要定義自己的複製建構函式,生成唯一的id。
賦值操作符:
複製和賦值常一起使用,可以使用合成複製建構函式的類通常也可以使用合成賦值操作符。一般而言,如果類需要複製建構函式,它也會需要複製操作符。
析構函式:
建構函式可以分配乙個緩衝區或開啟乙個檔案,在建構函式中分配了資源之後,析構函式可以**或者釋放資源。
撤銷類物件時會自動呼叫析構函式,動態分配的物件只有在指向該物件的指標被刪除時才撤銷。沒有刪除指向該物件的指標,則不會執行析構函式,物件一直存在,導致記憶體洩漏。
析構函式通常用於釋放在建構函式或在物件生命週期內獲取的資源。
三法則:
如果類需要析構函式,則它也需要賦值操作符和複製建構函式。這三個複製控制成員對類的行為進行控制。
由上述我們可以得出,對於乙個空類,系統也會產生預設的上述四類函式。
C 建構函式 析構函式 複製建構函式
無聊的廢話 距離開始放假已經過去半個月了,這半個月,品讀了一本實用型的繪畫書籍,作了幾幅作品,又做了乙個模型,只是探索未知領域總會遇到各種問題,甚至難以解決的問題,筆者頹廢了兩天煲了一部劇,覺得自己深深的辜負了時間,決定動手總結一下學過的知識,主要是總結資料結構,不過筆者看到當初c 的筆記,決定再鞏...
建構函式,複製建構函式和析構函式
這些函式在網上很容易就可以查到定義和寫法,這裡就不贅述了。令人感興趣的是這些函式什麼時候執行,特別是複製建構函式和析構函式。用編寫的一段 很醜的 來說明。include include include class point point const point obj point double ge...
建構函式 複製建構函式 型別轉換建構函式 析構函式
成員函式的一種,名字與類名相同,可以有引數,不能有返回值 void也不行 乙個類可以有多個建構函式。如果定義類時沒寫建構函式,則編譯器生成乙個預設的無參建構函式,這個建構函式不做任何操作。如果定義了建構函式,則編譯器不生成預設的無參建構函式。物件生成時建構函式自動被呼叫,物件一旦生成,就再也不能在其...