涉及到uml中的一些概念:關聯是表示兩個類的一般性聯絡,比如“學生”和“老師”就是一種關聯關係;聚合表示has-a的關係,是一種相對鬆散的關係,聚合類不需要對被聚合類負責,用空的菱形表示聚合關係
從實現的角度講,聚合可以表示為:
class a {…} class b { a* a; …..}
而組合表示contains-a的關係,關聯性強於聚合:組合類與被組合類有相同的生命週期,組合類要對被組合類負責,採用實心的菱形表示組合關係
實現的形式是:
class a{…} class b{ a a; …}
拓展:
指標的指標
指標的指標看上去有些令人費解。它們的宣告有兩個星號。例如:
char ** cp;
如果有三個星號,那就是指標的指標的指標,四個星號就是指標的指標的指標的指標,依次類推。當你熟悉了簡單的例子以後,就可以應付複雜的情況了。當然,實際程式中,一般也只用到 二級指標,三個星號不常見,更別說四個星號了。
指標的指標需要用到指標的地址。
char c='a';
char *p=&c;
char **cp=&p;
通過指標的指標,不僅可以訪問它指向的指標,還可以訪問它指向的指標所指向的資料。下面就是幾個這樣的例子:
char *p1=*cp;
char c1=**cp;
你可能想知道這樣的結構有什麼用。利用指標的指標可以允許被呼叫函式修改區域性指標變數和處理指標陣列。
void findcredit(int **);
main()
{
int vals[]={7,6,5,-4,3,2,1,0};
int *fp=vals;
findcredit(&fp);
printf(%dn,*fp);
}
void findcredit(int ** fpp)
{
while(**fpp!=0)
if(**fpp<0) break;
else (*fpp)++;
}
首先用一個數組的地址初始化指標fp,然後把該指標的地址作為實參傳遞給函式findcredit()。findcredit()函式通過表示式**fpp間接地得到陣列中的資料。為遍歷陣列以找到一個負值,findcredit()函式進行自增運算的物件是呼叫者的指向陣列的指標,而不是它自己的指向呼叫者指標的指標。語句(*fpp)++就是對形參指標指向的指標進行自增運算的。但是因為*運算子高於++運算子,所以圓括號在這裡是必須的,如果沒有圓括號,那麼++運算子將作用於二重指標fpp上。