前記:完成第三周的學(xué)習(xí),整個面向?qū)ο蟮母呒壘幊陶n(上)就結(jié)束了。前兩周主要講述類自身的特性:不帶指針的類,和帶指針的類;讓我認(rèn)識到了類的構(gòu)成要點(diǎn)、使用方法以及內(nèi)存管理的基礎(chǔ)理解。第三周則將重點(diǎn)放在了類與類之間的關(guān)聯(lián),包括三個武器:復(fù)合(組合)、委托、繼承,虛函數(shù)及多態(tài),以及重點(diǎn)講解了將三個武器組合使用的一個例子composite設(shè)計模式。侯老師的課是啟發(fā)式的,從這一個例子講解類與類之間的關(guān)系,理解難度很大,但是仔細(xì)跟隨設(shè)計思路思考,會啟發(fā)很多新的思路,對理解這三種基本也是頗有助力。
繼承與組合
侯老師上課時關(guān)于繼承和組合的關(guān)系,留下一個問題:子類Devried 公有繼承自父類base,并且含有一個component的對象。那么在構(gòu)建一個對象時,哪一個組件先生成呢?
現(xiàn)在來代碼測試:
#include<iostream>
using namespace std;
class base
{
int b;
public:
base() { cout << "base ctor.\n"; };
virtual ~base() { cout << "base dtor.\n"; };
};
class component
{
int c;
public:
component() { cout << "component ctor.\n"; };
~component() { cout << "component dtor.\n"; };
};
class Derived:public base
{
component co;
public:
Derived() { cout << "Derived ctor.\n"; };
~Derived() { cout << "Derived dtor.\n"; };
};
int main()
{
{
base B;
component C;
Derived D;
}
cin.get();
return 0;
}
運(yùn)行結(jié)果:
可以看出生成Derived對象D時,先調(diào)用base ctor,后調(diào)用component ctor。
理解:基類構(gòu)造函數(shù)構(gòu)造對象是先調(diào)用父類的構(gòu)造函數(shù)(類似于列表初始化),然后再進(jìn)行自身增加數(shù)據(jù)的構(gòu)造,而component對象com是屬于Derived類的一個數(shù)據(jù)成員,等父類的內(nèi)容構(gòu)造完成后,再調(diào)用component構(gòu)造函數(shù)構(gòu)造對象co。
UML類圖
侯老師在講解基本設(shè)計方式時,采用了一種圖形方式表達(dá)設(shè)計方式類成員間的關(guān)系,即UML類圖。能很簡潔的將個部分的邏輯關(guān)系展現(xiàn)出來,更清晰的展示設(shè)計思路。但開始接觸很生疏,很多表示方法不明白,結(jié)合課程中的講解和網(wǎng)上查閱資料總結(jié)一下知識點(diǎn)[1],[2]:
類(class)使用三層矩形表示,分3個部分:
1,類名。抽象類(含有純虛函數(shù)的類)用斜體表示。
2,字段和屬性。我理解為包含的數(shù)據(jù)成員。上圖中冒號(:)前面為notice為變量(對象)名,冒號(:)后為類型(類)名。變量(對象)名下加下劃線,表示靜態(tài)數(shù)據(jù)。
3,類的方法。虛方法使用斜體表示。冒號(:)前面為函數(shù)名和接受的參數(shù),冒號(:)后面為返回的參數(shù),靜態(tài)成員函數(shù)下加下劃線。
注意:在2、3中字段、屬性、方法前面可以加符號表示作用域:‘+’表示public,‘-’表示private,‘#’表示protected。
接口(interface),使用兩層矩形表示,分2個部分組成:
1,接口名
2,接口實(shí)現(xiàn)方法
我理解是一些全局的實(shí)現(xiàn)方法匯成的面向用戶(或下一級)的接口。
其他
途中折頁的白色框,用虛線連至方法,表示該方法中的關(guān)鍵性內(nèi)容。