1.拷貝構(gòu)造函數(shù)
??? 如果沒有自定義拷貝構(gòu)造函數(shù)治专,則編譯器默認(rèn)構(gòu)造一個(gè)说榆,直接按位拷貝影钉。
??? 類中如果帶指針則一定要自己寫拷貝構(gòu)造函數(shù)和拷貝賦值(重載操作符=)御蒲,否則只是復(fù)制指針(bitwise?copy/淺拷貝),既將兩個(gè)指針指向同一塊內(nèi)存垦梆。
??? 拷貝構(gòu)造函數(shù)采用深拷貝匹颤,首先要分配足夠的內(nèi)存,再將目標(biāo)內(nèi)容復(fù)制進(jìn)開辟的內(nèi)存空間中托猩。
2.拷貝賦值(重載操作符=)
??? 步驟:檢測(cè)自我賦值 若不是則 a.清理自身 b.分配足夠大空間 c.拷貝進(jìn)去印蓖,若是自我賦值則直接返回自身
??? 若沒寫自我賦值檢測(cè),則會(huì)造成錯(cuò)誤京腥,第一步a.清理自身時(shí)就把唯一的指針刪掉赦肃,步驟b無(wú)法獲得字符串長(zhǎng)度,也就無(wú)法分配內(nèi)存。
3.析構(gòu)函數(shù)
??? 對(duì)應(yīng)構(gòu)造函數(shù)他宛,構(gòu)造函數(shù)中分配了內(nèi)存則析構(gòu)函數(shù)中需要釋放船侧,否則會(huì)造成內(nèi)存泄漏。
??? 若使用new來(lái)生成對(duì)象厅各,則需要手動(dòng)delete掉
4.堆和棧镜撩,內(nèi)存管理
??? 棧:局部對(duì)象存在棧中,稱為stack object 或 auto object队塘,生存期只在作用域中琐鲁,離開作用域既消亡,會(huì)自動(dòng)析構(gòu)人灼,無(wú)需手動(dòng)清理围段。
??? 堆:自己new出來(lái)的對(duì)象存在堆中,在自己delete掉后生命結(jié)束投放。
??? 全局空間:包括static 對(duì)象和全局對(duì)象奈泪,程序結(jié)束后才會(huì)消亡。
??? new的步驟:a.分配內(nèi)存空間(operator new內(nèi)部調(diào)用malloc(n))灸芳;b.將void*指針轉(zhuǎn)型為對(duì)象類型指針涝桅;c.調(diào)用構(gòu)造函數(shù)
??? delete的步驟:a.調(diào)用析構(gòu)函數(shù);b.釋放內(nèi)存(operator delete)
??? array new 一定要搭配array delete(delete[]),若不加[],則只會(huì)調(diào)用1次析構(gòu)函數(shù)烙样,泄漏的內(nèi)存為指針?biāo)赶虻膬?nèi)存地址冯遂。
5.關(guān)于static
??? non-static member function可通過(guò)this指針調(diào)用non-static members
??? static data members 只有一份在全局空間,需要在類外部進(jìn)行定義
??? static member functions 與non-static member functions 區(qū)別在于沒有this指針谒获,只能處理static data members