標籤:des each 鍵盤 end and 個人 return 使用 變數
現實環境存在各種對象關係,可以使用特殊的關聯類型描述詞來形容這些關係。
例如:
1. 方形是屬於形狀的一種,可以用“is-a”來描述方形與形狀的關係。
2. 汽車都有方向盤,可以用“has-a”來描述汽車與方向盤的關係。
3. 程式員使用鍵盤編輯代碼,可以用“uses-a”來描述程式員與鍵盤的關係。
4. 花朵依賴蜜蜂傳播花粉,可以使用“depends-on”來描述花朵與蜜蜂的關係。
5. 學生是一個班級的成員,可以使用“member-of”來描述學生與班級的關係。
6. 肢體屬於人體的一部分,可以使用“part-of”來描述肢體與人體的關係。
使用C++進行物件導向的編程過程,如果能精準的理解對象間的關係,對編寫高品質的代碼有很大協助。
下面列出幾個典型的對象關係(非繼承):
一. 對象組合關係
對象組合關係易於理解,如一輛車是由車輪、車架、發動機等裝置群組成的,電腦是由顯示器,機箱,CPU等
裝置群組成的。這些關係稱為組合關係(composition),而在這種情況下,整車與輪子的關係為包含(“has-a”)。
在C++中,對象組合關係能夠將複雜的類轉化為多個簡單的類的組合,簡化了複雜類的操作。
對象組合又包含兩種形式:一種是組合,另一種是彙總。
1. 組合關係:
滿足組合關係包含下面幾個前提:
a. 成員必須是類的一部分;
b. 成員在一個時期只能屬於一個類;
c. 成員在一個類中必須存在;
d. 成員不必知道自身包含在某個類中。
組合的關係尤似人體與心臟的關係,部分必須包含於整體,整體必須由部分組成,某一時刻心臟
必須屬於某個人體,而不能屬於其他人體。組合關係強調對象的完整性必須由成員來保證,成員與對象是單向
保證的,即對象必須包含成員,而成員不一定存在於此對象。
class Point2D
{
private:
int m_x;
int m_y;
...
public:
...
}
其中m_x、m_y與類Point2D的關係即為組合關係。
2. 彙總關係
滿足彙總關係包含下面幾個要素:
a. 成員必須是類的一部分;
b. 成員在一個時期可以屬於多個類;
c. 成員在類中不必一定存在;
d. 成員不必知道自身包含在某個類中。
同組合關係一樣,彙總關係也是部分與整體的關係,但不同於組合關係,成員可以在同一時期屬於多個對象,
當彙總關聯性物件建立或消滅時,彙總成員既不負責建立對象的組件,也不負責消除對象的組件。這好比人與家庭住址的
關係,每個人都有住址,然而這個住址可以屬於多個人(父母兄弟)。人員不管理住址,事實上在人住那之前,那個地址
可能就已經存在。此外,人通常知道自己住址名稱,但住址不知道誰住在該處。這裡人與住址的關係就是彙總關係。
對彙總關係進行建模時,處理對象析構時,整體對象不負責銷毀彙總成員。
包含彙總關係的類實現同組合關係基本相同,因為它們都是屬於整體部分的關係。
在組合關係中,成員變數通常是普通變數,如果是指標,則組合類別必須負責分配和釋放該指標指向的空間。
在彙總關係中,成員變數通常是引用或者指標,並且該成員變數引用的是類範圍外的對象。因此,當對象被
銷毀時,其中彙總關係成員變數引用或指標將被銷毀,但是引用或指向的對象仍然存在。
如下樣本,教師與教師名字是組合的關係,教師必須有名字,教師與名字共存,教師類對象銷毀後,教師名字也銷毀了。
而教師與部門的關係是彙總的關係,該部門可以有很多其他教師,教師也可以同時屬於別的部門,該部門銷毀後,教師仍然存在。
#include <string> class Teacher{private: std::string m_name; public: Teacher(std::string name) : m_name(name) { } std::string getName() { return m_name; }}; class Department{private: Teacher *m_teacher; // This dept holds only one teacher for simplicity, but it could hold many teachers public: Department(Teacher *teacher=NULL) : m_teacher(teacher) { }}; int main(){ // Create a teacher outside the scope of the Department Teacher *teacher = new Teacher("Bob"); // create a teacher { // Create a department and use the constructor parameter to pass // the teacher to it. Department dept(teacher); } // dept goes out of scope here and is destroyed // Teacher still exists here because dept did not delete m_teacher std::cout << teacher->getName() << " still exists!"; delete teacher; return 0;}
對象關係分析(非繼承關係)