所有的 C++ 程序是由以下兩個基本要素組成:
封裝是一個面向?qū)ο缶幊痰母拍?,它將?shù)據(jù)和操作數(shù)據(jù)的函數(shù)結(jié)合在一起,并使其免受外部干擾和誤用。數(shù)據(jù)封裝是數(shù)據(jù)隱藏的重要面向?qū)ο缶幊谈拍睢?/p>
數(shù)據(jù)封裝是一種將數(shù)據(jù)和使用數(shù)據(jù)的函數(shù)結(jié)合在一起的機制;數(shù)據(jù)抽象是一種只將接口公開并且向用戶隱藏實現(xiàn)細(xì)節(jié)的機制。
C++ 支持封裝的屬性和通過創(chuàng)建用戶定義類型實現(xiàn)的數(shù)據(jù)隱藏,這稱為類。我們已經(jīng)研究過,一個類可以包含私有、保護和公有成員。默認(rèn)情況下,所有定義在一個類中的成員是私有的。例如:
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 類的其他成員可以訪問它們,而程序的任何其它的部分不能訪問它們。這是一個封裝的實現(xiàn)方式?! ?/p>
要想使類的某個部分成為共有的(即訪問您的程序的其他部分),你必須在 public 關(guān)鍵字后聲明它們。公有說明符后定義的所有變量或函數(shù)可以被程序中的其它函數(shù)訪問?! ?/p>
使一個類成為其它類的友元類就可以獲得實現(xiàn)細(xì)節(jié),降低封裝。這個思想就是獲得盡可能多的每個類的對其它類隱藏的細(xì)節(jié)。
任何一個實現(xiàn)有公有和私有成員的類的 C++ 程序都是一個數(shù)據(jù)封裝和數(shù)據(jù)抽象的例子??紤]下面的例子:
#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;
}
編譯和執(zhí)行上面的代碼時,它產(chǎn)生以下結(jié)果:
Total 60
上面的類實現(xiàn)了把數(shù)字加起來,并且返回總和。公有成員 addNum 和 getTotal 是對外的接口,用戶需要知道他們才能使用的類。私有成員 total 是用戶不需要知道的,但是它是為保證程序正常運行類所必要的。
經(jīng)過一段痛苦的經(jīng)歷,我們大多數(shù)人已經(jīng)學(xué)會了使類成員在默認(rèn)情況下是私有的,除非我們真的需要使它們變成公有的。這就是一個好的的封裝?! ?/p>
這個知識被頻繁的應(yīng)用于數(shù)據(jù)成員,它同樣適用于所有成員,包括虛函數(shù)。