初始化和清除 從構造和析構說起

2021-05-25 05:21:44 字數 1672 閱讀 8602

to be or not to be  that is the question

——the tragedy of hamlet,prince of denmark

建構函式和析構函式正如《哈姆雷特》那句經典的台詞一樣 to be or not

,這句話也十分經典的引出了我的開篇 。

建構函式 :確保初始化 to be

顧名思義即為了構造而產生,目的是為了初始化物件,constructor,是如此的重要以至於不

能把它留給客戶程式設計師來做。而建構函式是由編譯器呼叫的,當客戶程式設計師呼叫時這個物件已經初始化過了。而它的名字正是和類的名字一致(c++之父

stroustrup

的方法)這真是方便因為避免了與類中其它成員函式的衝突。

傳遞到建構函式的第乙個引數是this指標,這就呼叫了這一函式的物件位址,然而this 指標只是分配了這塊記憶體,沒有初始化,constructor就做了這項工作。

特點:1.名字與類名一致,並且由編譯器呼叫,

2.只要建立物件一定會呼叫到並且是由編譯器隱式的呼叫

3.沒有函式返回值型別,但可以有引數,並且可以有多個

對於特點的分析:

對於特點3 決定了建構函式可以被過載

實參決定了使用哪個建構函式

一般都採用預設的實參來寫建構函式(這是因為它減少**的重複性)

對於特點1 建構函式是自動執行的

ps:把建構函式宣告為const成員函式是不必要的。因為是初始化嘛 ,當然就一樣對待的。

建構函式的初始化方法:

1.初始化列表:這種方法非常的棒可以告訴編譯器我是在呼叫本建構函式之前就進行初始化,

對於資料成員是類型別的必須放在初始化列表中,還有就是const資料成員也必須在**進行初始化。這點在繼承中也深有運用。初始化的順序就是資料成員的定義順序(但這是無關緊要的)

2.資料成員在函式

內部進行初始化。(這個就不需多講啦)

預設建構函式 :

default constructor 就是不帶任何引數的建構函式 但是如果程式設計師不自己寫 由於它沒有引數所以為對行啊分配的都是些隨機的數。

乙個類哪怕只定義了乙個建構函式編譯器也不會為它生成

預設建構函式,這是因為:如果乙個類在某種情況下需要控制物件的初始化,則該類可能在所有的情況下都需要控制。

合成預設建構函式 :

synthesized default constructor:具有類型別的成員執行各自的預設建構函式來初始化,內建和復合型別的成員,如指標和陣列,只對定義的全域性作用域中的物件才初始化,對於定義在區域性的物件不進行初始化。

類通常定義乙個預設建構函式:這是因為很多的好處

其中之一就是:在預設建構函式中為成員提供的初始化值的物件總是空!

方式: a a;即可

抑制由建構函式定義的隱式轉換 :即在建構函式前宣告 explicit 該關鍵字僅能用於類的內部的建構函式的宣告上,在類外定義則不需重複(現在還沒有用到,之後需要完善!)

析構函式 :確保清除 not to be

和析構相反,這是為了毀滅,如果說構造是出生的話 那麼析構就是死亡 ,然而銷毀你創造的物件又是那麼的容易被遺忘。析構函式同樣是是由編譯器呼叫的,名字和類的一致只不過前面多了~,並且析構函式不能帶任何引數(因為析構函式不需要任何選項 當然啦!人家是毀滅!)

(寫的這些都不太完善 等我的閱歷更深的時候 我就來好好完善它吧 )

5 初始化器和析構器

物件初始化器 init方法是有返回值的,而且有時候返回值會是另乙個物件。因此,如果alloc與init分開寫時,需要對變數重新賦值。customclass c1 customclass alloc init customclass c1 customclass alloc c1 c1 init 保險...

類的初始化 賦值和析構

一般情況下,對於類的初始化操作,使用建構函式來完成類的初始化操作。要想理解和學習類的初始化,主要要弄明白如下幾個問題 1 c 提供了哪些初始化類的方法?2 為什麼要建構函式來初始化類?3 使用建構函式初始化類具體做什麼?c 提供兩類對於類的初始化方法 第一類 從c語音繼承來的顯示初始化列表 clas...

C 多個物件的構造和析構與初始化列表

初始化列表 在類中定義的資料成員一般都是基本的資料型別。但是類中的成員也可以是物件,我們叫物件成員。c 中對於物件的初始化是非常重要的操做,當建立乙個物件時候,c 編譯器必須確保呼叫了所有物件成員的建構函式,如果物件成員有預設建構函式編譯器會自動呼叫它們。1.如果類有成員物件,那麼呼叫的時候先呼叫成...