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位會填充一些東西進去。
不過我也沒有很好的拓展,也不清楚拓展路徑.....不過筆記要努力越寫越好