乙個類物件,當生命週期結束時,該物件會呼叫自身的析構函式。
乙個類的指標,當使用delete函式來刪除該指標時,會呼叫該指標當前型別的析構函式。
比如:
classb* pclass = (classb*)new classa;
delete pclass;
儘管該指標實際上是
class
a*型別,但將其轉換為
class
b*型別,那麼
delete時,呼叫的是
class
b的析構函式。
對於某些特殊型別,如void,int等,本身沒有析構函式,所以若將乙個類指標強轉為void
*,int
*等,則delete時,不會呼叫析構函式。
實際上,乙個類的自然釋放過程,是先執行析構函式,再逐個釋放成員變數。 設classa有成員變數class
ae,class
b有成員變數class
be,則:
classb* pclass = (classb*)new classa;
delete pclass;
會發現,先執行
class
b的析構函式,再執行
class
be的析構函式。但實際上由於並沒有
class
be的存在,故也就不執行
class
be的析構函式。若內部沒有涉及巢狀的指標,那麼這裡並不會報錯。
故delete乙個指標時,務必保證該指標的當前型別就是其定義的型別。
另外,子類自然釋放時,會先呼叫自身析構函式,再呼叫父類析構函式。
設以下操作均不涉及內部指標且沒有報錯:
① 父類指標轉為子類指標,並刪除:會先執行子類析構函式,再執行父類析構函式
② 子類指標轉為父類指標,並刪除:會執行父類析構函式,子類析構函式不會得到呼叫
所以,析構函式最好定義為virtual。
空指標 void 指標 new及delete
如題分別總結這些和指標有關的一些知識點 1.指向任意型別的指標void 很多人誤以為void 型別的指標就是空指標,這是不對的。void 型指標,表示定義乙個指標,但不指定它指向那種型別的資料。void 型別的指標作為一種通用的指標,可以和其他任何型別的指標 函式指標除外 相互轉化而不需要型別強制轉...
void的乙個用途
今天看到一段案例 覺得挺有意思的 void ouch int sig 這裡在signal函式前寫了void,到底為啥要寫呢?在網上隨便搜尋了一下,沒有找到相關的回答。自己思考了一下,得出了乙個自以為是的結論 note void不能用來定義型別,但是卻可以做乙個表態,即表態signal函式,沒有必要考...
C語言中void 和C 中void 的乙個區別
1 在c語言中,型別檢查不是很嚴格,因此可以將void 賦值給 type c檔案中 int a 0 int ptr a void ptr1 ptr int ptr2 ptr1 允許將void 型別賦值給int 不會報錯2 在c 中型別檢查比較嚴格,因此不允許將void 賦值給type cpp檔案中 ...