C可以用於設計和實現抽象數據類型(ADT,abstract data type),因爲他可以限制函數和 數據定義的作用域。
這個技巧也被稱爲黑盒(black box )設計。
抽象數據類型的基本思想:模塊具有功能說明;模塊所執行的任務;接口說明;模塊的使用方法;
模塊的用戶並不需要知道模塊實現的任何細節,並且除了已經定義好的那些接口以外, 用戶不能一任何方式訪問模塊任何內容。
限制對模塊的訪問是通過static關鍵字的合理使用實現的,他可以限制對那些並非接口的函數和數據的訪問。
例如:一個用於維護一個地址/電話號碼列表的模塊。模塊必須提供函數,根據一個制定的名字查找地址和電話號碼。
但列表存儲的方式依賴於具體的實現,並且這個信息爲模塊所私有客戶並不清楚,也不必清楚。
注意:
注意頭文件中不可以放變量的定義!!!一般情況下頭文件中只放變量的聲明,因爲頭文件要被其他文件包含(即#include),如果把定義放到頭文件的話,就不能避免多次定義變量,C++不允許多次定義變量,一個程序中對指定變量的定義只有一次,聲明可以無數次。不過有三個例外,一下三中實體的定義也可放到頭文件中。
1.值在編譯時就已知的const 變量的定義可以放到頭文件中 如:const int num(10);
2.類和結構體類型的定義可以放到頭文件中
3.inline 函數這三個實體可以定義在多個源文件中,只要在每個源文件中的定義相同。 參考------c++ primer
是時間該看一個例子的時候了,下面的程序說明了這個模塊的一種可能的實現方法。
頭文件定義了一些由客戶使用的接口。
/*filename : addrlist.h*/
/*
*地址模塊的聲明
*/
/*
*數據特徵
*各種數據的最大長度(包括結尾的NUL字節)和地址的最大數量
*/
#define NAME_LENGTH 30
#define ADDR_LENGTH 100
#define PHONE_LENGTH 11
#define MAX_ADDRESSES 1000
/*
*接口函數
*根據給出名字,查找對應的地址
*/
char const *
lookup_address(char const *name);
/*給據給出的名字查找對應的電話號碼*/
char const *
lookup_phone(char const *name);
=================================================================================================
/*file name : addrlist.c*/
/*用於維護一個地址列表的抽象數據類型*/
#include "addrlist.h"
#include <stdio.h>
/*
*每個地址的三個部分分別保存於三個數字化的對應元素中
*
*/
staticchar name[MAX_ADDRESSES][NAME_LENGTH];
staticchar address[MAX_ADDRESSES][ADDR_LENGTH];
staticchar phone[MAX_ADDRESSES][PHONE_LENGTH];
/*
*在數組中查找一個名字返回查找的位置的下標
*如查詢不到則直接返回-1
*/
staticint
find_entry(char const *name_to_find)
{
int entry;
for(entry = 0; entry < MAX_ADDRESSES;entry ++)
if(strcmp(name_to_find,name[entry]) == 0)
return entry;
return -1;
}
/*
*給定一個名字查找並返回對應的地址
*如果名字沒有找到直接返回一個NULL指針
*/
char const *
lookup_address(char const *name)
{
int entry ;
entry = find_entry(name);
if(entry == -1)
return NULL;
else
return address[entry];
}
/*
*根據給定的名字查找並返回對應的電話號碼,如名字不存在則返回NULL指針
*/
char const *
lookup_phone(char const *name)
{
int entry ;
entry = find_entry(name);
if (entry == -1)
return NULL;
else
return phone[entry];
}
這個例子可以很好的說明黑盒的功能。黑盒通過規定特定的接口,來提供給外部用戶的訪問
在這個例子中,接口函數是lookup_address和lookup_phone。用戶不能直接訪問和模塊實現有關的
數據,如數組或輔助函數find_entry,因爲這些內容被聲明爲static。
這種黑盒的概念使實現細節與外界隔絕,這就消除了用戶試圖直接訪問這些實現謝姐的誘惑,
這樣訪問模塊唯一可能的方法就是通過模塊所定義的接口。
這種開發模式是非常重要的,尤其是在大型項目規劃中,很多時候我們只考慮接口問題,
其中具體的實現細節我們可以暫不考慮,一提高團隊整體合作開發的速度。