C++面向?qū)ο蟪绦蛟O(shè)計-Second Week


Class with pointer members(必須有copy ctor + copy op)

定義了Rectangle類;

ctor(構(gòu)造函數(shù))

Rectangle(int width, int height, int x, int y);

dtor(析構(gòu)函數(shù)):

~Rectangle();

? ? ? ? ?不帶指針的Class可以不必寫析構(gòu)函數(shù),帶指針的Class有必要寫析構(gòu)函數(shù),操作結(jié)束后必須釋放內(nèi)存防止內(nèi)存泄漏。

拷貝構(gòu)造函數(shù):

Rectangle(const Rectangle& other);

引用構(gòu)造過的Rectangle對象。

淺拷貝和深拷貝:

? ? ? ? ?我的理解是:淺拷貝打個比方就好像給一個存在的對象取了一個別名,其實新建了一個指針指向同一個元素,操作中會很危險,比如釋放掉原指針指向的對象那么淺拷貝創(chuàng)建的指針就會指向一個不存在的對象會出錯。

? ? ? ? ?而深拷貝則是申請了一塊相同大小的內(nèi)存空間,并將原對象值依次賦給新對象。

拷貝賦值函數(shù):

Rectangle::operator = (const Rectangle& other);

if(this == &str)//檢測自我賦值

return *this;

規(guī)范的寫法最好要檢測自我賦值,避免可能出現(xiàn)的錯誤。

delete width;

width = new int(*other.width);

函數(shù)中應(yīng)該先釋放掉原對象,重新給原對象分配和即將賦值對象的內(nèi)存大小。

stack objects

生命周期較長,直到整個程序結(jié)束才會消亡,不會隨著對象的消亡而消亡,有點類似全局對象。

heap bojects

在作用域之外生命期就結(jié)束了。

global objects

生命在整個程序結(jié)束之后才結(jié)束。

new 和 delete兩種操作有點相反:

new先分配mempry然后轉(zhuǎn)型再調(diào)用ctor,而delete先調(diào)用dtor再釋放memory。

array new 一定要搭配 array delete 執(zhí)行多次ctor同時也要執(zhí)行多次dtor,否則也會造成內(nèi)存泄漏。

調(diào)用static函數(shù):

可以用過object調(diào)用,也可以通過Class name調(diào)用


感悟:

這周老師講的某些內(nèi)容很有趣;

比如數(shù)據(jù)在內(nèi)存中的分配,cookie和debug單元,不滿16位會填充一些東西進去。

不過我也沒有很好的拓展,也不清楚拓展路徑.....不過筆記要努力越寫越好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容