天天看點

C++進階學習----構造析構

微信公衆号【程式設計學習基地】

構造函數

構造函數的使用

特點:

構造函數的重載

析構函數

析構函數的使用

特點

關于delete[]

構造析構順序

初始化清單

為成員變量賦初值,配置設定資源,設定對象的初始狀态 可以了解為類的初始化函數
構造函數一般用于為對象配置設定記憶體空間

函數名與類名相同,沒有傳回類型

對象建立時自動調用且隻調用一次

如果沒有定義構造函數,那麼編譯器會自動生成一個預設的構造函數,隻是這個構造函數的函數體是空的,也沒有形參,也不執行任何操作

一般通路屬性為public,除非我們不允許外部建立對象

和普通成員函數一樣,構造函數是允許重載的。一個類可以有多個重載的構造函數,建立對象時根據傳遞的實參來判斷調用哪一個構造函數
建立對象時系統會自動調用構造函數進行初始化工作,對應的,銷毀對象時系統也會自動調用一個函數來進行清理工作
銷毀對象時系統自動調用析構函數

構造函數的名字和類名相同,而析構函數的名字是在類名前面加一個~符号

對象銷毀時自動調用且隻調用一次

如果使用者沒有定義,編譯器會自動生成一個預設的空的析構函數

析構函數沒有參數,不能被重載,是以一個類隻能有一個析構函數

為什麼釋放多個記憶體要加[]

為了測試這一情況,定義一個類

在主函數中申請多個對象後加[]釋放

不加[]釋放

可以看出**不加[]**隻釋放一個對象的記憶體,并且還會報錯

其實呢,在申請多個記憶體是傳回的記憶體位址并不是申請的記憶體首位址而是向右移4個位元組之後的位址,我們可以列印出隐藏的4個位元組内容

這樣你會發現隐藏的4個位元組存儲了你申請的對象數量,當delete加[]時,會先通路這4個位元組的資料,然後再釋放記憶體

在構造析構順序之前先看一下

對象建立過程(以堆區為例)

為整個對象配置設定記憶體

構造基類部分(如果存在基類)

構造成員變量

執行構造函數代碼

對象的銷毀過程

執行析構函數代碼

析構成員變量

析構基類部分

釋放整個對象占用記憶體

這樣我們先建立三個類(a,b,c),其中b類中有a對象,c類中有b對象

簡化成員變量初始化,僅僅隻是為了書寫友善,沒有效率上的提升

在初始化清單中需要注意的是參數初始化順序與初始化表列出的變量的順序無關,它隻與成員變量在類中聲明的順序有關,這個會導緻什麼問題呢

這裡隻是該變了初始化清單的順序,然後用m_height成員變量去初始化m_age

造成這樣後果的原因是初始化清單先初始化m_age,再初始化m_height