您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關C++中構造函數與析構函數如何使用,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
原因:程序中對象的創建和銷毀是一個非常特殊的事情,有編譯器來調用它們來完成,而這里的構造函數和析構函數便是創建和銷毀的兩個函數,它們是作為鉤子函數來被編譯器調用的。
也正是因為如此,它們才不需要有返回值,因為一旦有了返回值,編譯器就必須知道如何來處理返回值,而編譯器有沒有辦法做決策,只能放權給程序員來操作,這和構造函數和析構函數的調用機制是沖突的,所以構造函數和析構函數才沒有返回值。
當然,我們可以在多態的時候,不將構造函數定義成虛函數,這樣也是可以編譯運行的,并且指定繼承類創建和銷毀的時候,也沒有問題。
可是,我們實現多態的目的是什么呢?其實就是為了創建一個繼承類,但是指針卻是基類,我們在使用這個基類指針的時候,卻可以在程序運行的時候去執行對應的繼承類的對應函數。常用例子,可以參考工廠模式。
既然我們希望用基類的指針去表示繼承類,這種情況下如果析構函數不是虛函數,就有可能出問題,基類指針析構函數被調用時,不會去釋放繼承類自己部分的那一部分數據,會導致這部分數據釋放不掉。
這個跟多態的實現機制有關系,多態對虛函數的實現,是先給一個類對象實例化一個虛函數指針,再把這個虛函數指針指向虛函數列表,從而實現多態。
構造函數是類對象實例化的時候,首先調用的,所以一旦一個類有對象了,那么構造函數就調用完了,也就是說構造函數被調用的時候,并沒有對象生成,沒有對象也就沒有虛函數指針,而虛函數的函數地址都是會存儲在虛函數列表的,構造函數都執行完了結果還沒有去找這個虛函數對應虛函數列表中的位置。
構造函數不能使用virtual的原因與3中的原因類似,不過不同的是執行構造函數的時候,構造函數里面執行虛函數的話,沒有辦法通過這個對象的虛指針去找到虛函數列表。因為這個時候類對象還沒有創建起來,所以找不到虛函數指針。
析構函數在繼承類的析構函數被調用的時候,對象內的類變量被認為是未定義的值,所以也就沒有辦法找對對應的虛函數列表,當然也就沒有辦法找對虛函數列表中的對應函數地址。而在進入了基類的析構函數之后,這個類就被認為是基類的對象了,所以虛函數其實就沒有意義了,因為這個虛函數其實對應的就是基類里面的那個函數了,沒辦法實現多態的作用。
以上就是C++中構造函數與析構函數如何使用,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。