第一次學習c++ class時僅對構造器和析構器有了乙個初步的認識,「構造器在建立類物件時被自動呼叫,用來初始化物件中的成員;析構器在銷毀物件時被自動呼叫,用於完成清理工作」,但這個還是停留在表面,比較淺顯,對於一些概念的認識還很模糊。如今第二次學習,有了更深層次的認識和感受,寫此文章來梳理一下,論述一下。
首先,類物件有兩種:棧上物件和堆上物件。棧上物件就如同c語言中的棧上變數,一樣;堆上物件就如同c語言中的堆上變數,一樣。無非是,棧上物件由系統自動開闢空間和釋放空間,堆上的物件要由程式設計師手動申請空間和銷毀空間(c++中使用new/new【】和delete/delete【】)。由於棧物件的生命週期完全由系統控制,比較簡單,不再論述。這裡只論述一下堆物件。
對於堆物件來說,即常說的指標物件,stu * pstu = new stu ; delete pstu ; 。new用來開闢乙個物件的空間,delete則用來銷毀這個物件的空間。只有new才能觸發構造器,只有delete才能觸發析構器。
=》較個真兒:建立堆物件時,先new,開闢乙個空間,然後觸發構造器初始化成員;delete時,先觸發析構器,清理工作,然後銷毀空間。
=》再較個真兒:只有new出來乙個空間,才能繼續觸發構造器進行初始化;只有delete先觸發析構器進行清理工作,然後再銷毀空間。
這段話是我第一次學習時的理解,也許存在錯誤。另外自己太較真兒了,但大可不必計較執行的先後順序,即使認為是同時的應該也不為過。
可以看出,下劃線這段話其實表述的很模糊。第二次學習時,自己有了乙個更清晰的認識:要搞清楚,建立/開闢的是誰的空間,又為誰初始化?銷毀的是誰的空間,又清理的是誰的空間?
建立/開闢的是類的例項——物件的空間,為其中的成員進行初始化,如果物件中有指標成員時,往往要為其再開闢一段堆記憶體。清理的是物件空間中的成員,主要是清理其中申請的堆記憶體,然後再銷毀的是物件本身的空間。
這個東西很像c語言中對於堆記憶體的層次化管理:申請時由外向內,釋放時由內向外。如果理解了這個,再來理解析構器就不難了。這裡其實就是乙個是否存在兩層記憶體的問題,有就用析構器來乾掉裡面那一層。本質上還是堆記憶體的層次化管理的思想。
那麼,析構器是不是必須的?不是必須的。在物件中沒有指標成員來開闢堆空間時,就不用析構器來清理了。使用系統預設提供的空體析構器就好,即什麼都不做。如果物件中有指標成員,並為其開闢了堆記憶體,那麼一定要自實現析構器來清理這部分堆空間。
最後再次強調:這裡並不是針對物件本身的空間,無論是棧上的還是堆上的。針對的是物件空間中是否再次申請了堆記憶體,有則需要在析構器中delete掉。
c class和struct的區別
眾所周知c 語言為物件導向的程式設計,我們在實際程式設計時,所用的關鍵字為class 而struct為結構體關鍵字,主要是作為一種資料結構採用,並不把它當做物件。他們之間的異同主要在與那裡呢?1class a 我們可以使用 struct a a 來進行初始化,而一般的類當然也可以做到了,但是需要加上...
C class和struct的區別
這裡有兩種情況下的區別。1 c的struct與c 的class的區別。2 c 中的struct和class的區別。在第一種情況下,struct與class有著非常明顯的區別。c是一種過程化的語言,struct只是作為一種複雜資料型別定義,struct中只能定義成員變數,不能定義成員函式。例如下面的c...
C class和struct的區別
class 和 struct的乙個區別就是對預設的繼承訪問許可權不同 class的預設訪問屬性是私有的 private 而struct的預設訪問屬性是公共的 public 用class定義類 class a 這與下面 等價 class a 而用struct定義類 struct a 這樣下面 等價 s...