C++數據封裝
所有的C++程序有以下兩個基本要素:
-
程序語句(代碼):這是一個程序,執行動作的一部分,並且它們被稱為功能。
-
程序數據:數據是受到程序功能的程序影響的信息。
封裝是操縱數據的數據和功能結合在一起的麵向對象編程的概念,並保持既安全以及不受外界乾擾和誤用。數據封裝是數據隱藏的重要OOP概念。
數據封裝是綁定的數據的機製,使用它們和數據抽象的功能是僅暴露的接口和隱藏來自用戶的執行細節的機製。
C++支持封裝的屬性和數據通過創建用戶定義類型,稱為類的隱藏。我們已經研究學習了類可以包含私有(private),保護(protected)和公共(public)成員。默認情況下,在一個類中定義的所有項目都是私有(private)的。例如:
class Box { public: double getVolume(void) { return length * breadth * height; } private: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box };
變量長度(length),寬度(breadth)和高度(height)都是私有的。這意味著它們隻能由Box類的其他成員進行訪問,而不是程序的任何其他部分。這是封裝實現的一種方法。
為了使一個類的公共(即,訪問程序的部分)部分,必須在public關鍵字後聲明。所有變量或公共說明之後定義,函數在程序中的所有其他功能進行訪問。
使一個類是另一個友元類公開的實施細節,這降低了封裝。理想的是保持儘可能多的每個類隱藏所有其他類可能的細節。
數據封裝例子:
這裡是實現一個類的公共和私有成員的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是外麵的世界接口,用戶需要知道它們使用的類。私有成員total是從外界隱藏的,但是需要類能正常工作。
設計策略:
我們大多數人都通過痛苦的經驗教訓,默認情況下使類成員設置為私有,除非我們真的需要將其暴露。這隻是良好的封裝。
這是最常用於數據成員,但它同樣適用於所有成員,包括虛擬函數。