1. Big There —— 三個特殊函數(shù)
拷貝構(gòu)造(copy ctor)
拷貝構(gòu)造函數(shù)的第一個參數(shù)必須時自身類類型的引用,而且?guī)缀蹩偸且粋€const的引用般婆;
如果類未定義自己的拷貝構(gòu)造橄维,則編譯器會合成一個浩村;
class with pointer members 必須有 copy ctor 和 copy op=,因為使用默認的會指針會指向同一個東西椒功;
拷貝賦值(copy cp=)
其實就是重載賦值運算符;
返回值是左側(cè)對象的引用智什;
函數(shù)體內(nèi)第一步就是進行檢測自我賦值(self assignment),如果不檢測的話动漾,不僅效率會降低,而且可能會導(dǎo)致錯誤荠锭;
-
步驟:
- 檢測自我賦值旱眯;
- 先將自己delete
- 創(chuàng)建一個足夠大的空間;
- 拷貝賦值证九;
return *this;
析構(gòu)函數(shù)(dtor)
dtor 是類的一個成員函數(shù)删豺,名字有波浪號接類名構(gòu)成;
它沒有返回值愧怜,也不接受參數(shù)呀页,只會有唯一一個析構(gòu)函數(shù);
作用:釋放對象在成存期分配的所有資源拥坛;
隱式銷毀一個內(nèi)置指針類型的成員不會delete它所指的對象蓬蝶;
2. 所謂棧(stack),所謂堆(heap)
- 靜態(tài)內(nèi)存用來保存局部static對象猜惋,類static數(shù)據(jù)成員疾党,以及定義在任何函數(shù)之外的變量;
- Stack:棧內(nèi)存用來保存定義在函數(shù)體內(nèi)的非static對象
- heap : 是指由操作系統(tǒng)提供的一塊global內(nèi)存空間惨奕,程序可動態(tài)分配從其中獲得若干區(qū)塊雪位;
3. 關(guān)于new , 關(guān)于delete
- 基礎(chǔ)知識——來源于c++ primer P400
分配在靜態(tài)或棧內(nèi)存中的對象由編譯器自動創(chuàng)建和銷毀,對于棧對象梨撞,僅在其定義的程序塊運行時才存在雹洗,static對象在使用之前分配香罐,在程序結(jié)束是銷毀;但是除了靜態(tài)內(nèi)存和棧內(nèi)存时肿,每個程序還擁有一個內(nèi)存池——堆(heap)庇茫,程序用堆來存儲動態(tài)分配的對象——也就是,那些程序在運行時分配的對象螃成,動態(tài)對象的生存期有程序來控制旦签,也就是說,當(dāng)動態(tài)對象不再使用時寸宏,我們必須顯示銷毀它們宁炫。
-
在c++中,new 和 delete 是一對來進行動態(tài)內(nèi)存管理的運算符
- new : 在動態(tài)內(nèi)存中為對象分配空間并返回一個指向該對象的指針氮凝;
- delete : 接受一個動態(tài)對象的指針羔巢,銷毀該對象,并釋放與之關(guān)聯(lián)的內(nèi)存罩阵;
通過老師對動態(tài)分配所得的 array 的講解竿秆,得出一個重要結(jié)論:array new 一定要搭配 array delete.
4. OOP
Composition
表示 has-a 的關(guān)系
-
復(fù)合關(guān)系下的構(gòu)造與析構(gòu)
- 構(gòu)造由內(nèi)而外:container的構(gòu)造函數(shù)首先調(diào)用component的默認構(gòu)造函數(shù);
- 析構(gòu)由外而內(nèi):container的析構(gòu)函數(shù)首先執(zhí)行自己稿壁,然后才調(diào)用component的析構(gòu)函數(shù)
-
Delegation
- 用指針相連幽钢,composition by reference;
- 分為對外不變和真正的實現(xiàn)兩部分,指針將來可以指向不同的實現(xiàn)端傅是,客戶端不受影響匪燕;
Inheritance
表示 is-a 的關(guān)系;
-
復(fù)合關(guān)系下的構(gòu)造與析構(gòu)
- 構(gòu)造由內(nèi)而外:derived的構(gòu)造函數(shù)首先調(diào)用base的默認構(gòu)造函數(shù)落午;
- 析構(gòu)由外而內(nèi):derived的析構(gòu)函數(shù)首先執(zhí)行自己谎懦,然后才調(diào)用base的析構(gòu)函數(shù);
基類的析構(gòu)函數(shù)必須是virtual.
-
關(guān)于虛函數(shù)
- non-virtual : 聲明non-virtual函數(shù)的目的就是為了令derived classes繼承函數(shù)的接口以一份強制性實現(xiàn)。也就是說溃斋,你不希望derived class重新override 它界拦;
- virtual : 聲明 impure virtual 函數(shù)的目的是讓derived classes 繼承該函數(shù)的接口和函數(shù)實現(xiàn),你希望derived class 重新override ,并且你對它已有默認定義梗劫;
- pure virtual : 聲明一個pure virtual 函數(shù)的目的是為了讓derived classes 只繼承函數(shù)接口享甸,你希望derived class 一定要重新override ,你對它沒有默認定義。