C++數據抽象
數據抽象是指,隻提供必要的信息提供給外界,並隱藏其後台的細節,也就是,以表示在程序所需要的信息,而無需呈現的細節。
數據抽象是一種編程(設計)技術,它依賴於接口和實現的分離。
一個現實生活中的例子:一台電視機,可以打開和關閉,換頻道,調整音量,並添加外部組件,如揚聲器,錄像機和DVD播放器,但你不知道它的內部細節,即是,不知道它是如何在空中或通過電纜,如何轉化接收信號,並最終在屏幕上顯示出來。
因此,我們可以說,電視顯然其外部接口的分開內部實現,可以使用它的接口,如電源鍵,頻道轉換和音量控製播放,而無需了解其內部零件知識。
現在就C++編程而言,C++類提供的數據抽象很高水平。它們提供足夠的公共方法向外界的對象功能發揮和操縱對象數據,即,不用知道類如何在內部實現。
例如,程序中可以調用sort()函數不知道什麼算法函數實際使用給定值進行排序。事實上,底層實現的排序功能可以在庫版本之間切換,隻要接口保持不變,函數調用仍然可以工作。
在C++中,我們使用類來定義自己的抽象數據類型(ADT)。可以使用ostream類的cout對象流數據,以這樣的標準輸出:
#include <iostream> using namespace std; int main( ) { cout << "Hello C++" <<endl; return 0; }
在這裡,不需要了解cout如何在用戶屏幕上顯示文字。隻需要知道的公共接口和cout的底層實現可自由改變。
訪問標簽強製抽象:
在C++中,我們使用訪問標簽來定義的抽象接口類。一個類可以包含零個或多個接入標簽:
-
使用公共標簽定義的成員都可以訪問該程序的所有部分。一個類型的數據的抽象視圖是由它的公共成員來定義。
-
使用私有標簽定義的成員無法訪問到使用類代碼。私有部分隱藏代碼,使用類型的實現。
有關於如何經常訪問的標簽可能出現冇有任何限製。每個訪問的標簽指定隨後的成員定義的訪問級彆。指定的訪問級彆一直有效,直到下一次訪問標簽遇到或類主體的關閉右括號都被認為是。
數據抽象的好處:
數據抽象提供了兩個重要的優勢:
-
類的內部受到保護,不受無意的用戶級錯誤,這可能會損壞對象的狀態。
-
這個類實現可能隨著時間的推移在應對不斷變化的需求或錯誤報告,而無需改變用戶級代碼。
通過定義數據成員隻在類的私有部分,該類作者可隨意更改數據。如果實現轉換,隻有類代碼需要檢查,看看有什麼影響變化可能。如果數據是公開,然後直接訪問舊表示的數據成員的任何函數可能被打破。
數據抽象例子:
在這裡實現一個類的公共和私有成員,任何C++程序是數據抽象的一個例子。考慮下麵的例子:
#include <iostream> using namespace std; class Adder{ public: // constructor Adder(int i = 0) { total = i; } // interface to outside world void addNum(int number) { total += number; } // interface to outside world int getTotal() { return total; }; private: // hidden data from outside world int total; }; int main( ) { Adder a; a.addNum(10); a.addNum(20); a.addNum(30); cout << "Total " << a.getTotal() <<endl; return 0; }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Total 60
上麵的類增加了數字相加,並返回總和的功能。公有成員addNum和getTotal是外麵世界的接口,用戶需要知道它們使用的類。私有成員總和是什麼,用戶不需要了解,隻需要類能正常工作。
設計策略:
抽象的代碼分離到接口和實現。所以在設計組件時,必須保持獨立的接口執行,這樣,如果改變底層實現,那麼接口將保持不變。
在任何程序使用接口這種情況下,它們不會受到影響,將隻需要使用最新的執行重新編譯。