Q1:為上周題目中的Fruit和Apple添加構造函數(shù)與析構函數(shù)梦碗,并在構造函數(shù)與析構函數(shù)中打印控制臺信息喘沿,觀察構造和析枸調(diào)用過程。
在棧區(qū)創(chuàng)建Fruit對象猾骡,創(chuàng)建時調(diào)用了Fruit類的構造函數(shù)较屿,銷毀時調(diào)用Fruit類的析構函數(shù)。
在堆區(qū)創(chuàng)建Fruit對象卓练,創(chuàng)建時會先分配空間隘蝎,然后調(diào)用Fruit類的構造函數(shù),并把指針傳回襟企,控制臺只能顯示調(diào)用構造函數(shù)這一步嘱么。銷毀時會先調(diào)用析構函數(shù),然后再釋放內(nèi)存顽悼,控制臺只能顯示調(diào)用析構函數(shù)這一步曼振。
在堆區(qū)創(chuàng)建Apple對象几迄,并用父類指針指向它(upcast),這樣構造函數(shù)的調(diào)用次序依次是父類構造函數(shù)冰评、子類構造函數(shù)映胁。析構時先調(diào)用子類析構函數(shù),再調(diào)用父類析構函數(shù)甲雅。
在棧區(qū)創(chuàng)建Apple對象解孙,調(diào)用構造函數(shù)時,先父類再子類抛人,調(diào)用析構函數(shù)時弛姜,先子類再父類。
Q2:然后為Apple類重載::operator new和 ::operator delete妖枚,在控制臺打印信息廷臼,并觀察調(diào)用結果。
在棧區(qū)創(chuàng)建Fruit對象绝页,創(chuàng)建時調(diào)用了Fruit類的構造函數(shù)荠商,銷毀時調(diào)用Fruit類的析構函數(shù)。
在堆區(qū)創(chuàng)建Fruit對象续誉,創(chuàng)建時會先分配空間莱没,然后調(diào)用Fruit類的構造函數(shù),并把指針傳回屈芜,控制臺只能顯示調(diào)用構造函數(shù)這一步郊愧。銷毀時會先調(diào)用析構函數(shù)朴译,然后再釋放內(nèi)存井佑,控制臺只能顯示調(diào)用析構函數(shù)這一步。
在堆區(qū)創(chuàng)建Fruit對象眠寿,會調(diào)用全局new躬翁、delete運算符。
在堆區(qū)創(chuàng)建Apple對象盯拱,并用父類指針指向它(upcast)盒发,會調(diào)用Apple類的new、delete運算符狡逢。
在堆區(qū)創(chuàng)建Apple類數(shù)組宁舰,大小為5個sizeof(Apple)加上一個指針的大小,且后被創(chuàng)建的對象先被銷毀奢浑。
在創(chuàng)建時強制調(diào)用全局的new運算符蛮艰,在銷毀時由于沒有要求強制調(diào)用全局delete運算符,Apple類的delete運算符被調(diào)用了雀彼。為了保持一致性壤蚜,應該在delete前面也加上::
為了呼應第三周的作業(yè)而寫的測試代碼即寡,首先在堆區(qū)創(chuàng)建一個數(shù)組,每個元素是一個Fruit類型的指針袜刷,大小是5×指針大小聪富,20(32位)或40(64位)。再創(chuàng)建5個Apple類型對象著蟹,以父類指針指向它們(upcast)墩蔓,會調(diào)用Apple類的new分配空間,父類構造函數(shù)草则,子類構造函數(shù)钢拧,把指針傳回。銷毀時先調(diào)用子類析構函數(shù)炕横,父類析構函數(shù)源内,再銷毀內(nèi)存,最后調(diào)用全局delete運算符釋放分配給指針數(shù)組的空間份殿。