W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本書之前提到了“封裝”的概念,即指將一系列指令放在一個(gè)函數(shù)體內(nèi)部的處理過程。而這樣的做法則是為了將函數(shù)的接口與它的實(shí)現(xiàn)分離(函數(shù)接口指如何使用這個(gè)函數(shù),函數(shù)實(shí)現(xiàn)則指如何去實(shí)現(xiàn)這個(gè)函數(shù)及實(shí)現(xiàn)具體做了些什么)。
上面提到這種封裝可以命名為“功能封裝”,用以區(qū)分本章將要介紹的“數(shù)據(jù)封裝”。數(shù)據(jù)封裝是基于這樣的理念提出的:每一個(gè)結(jié)構(gòu)的定義應(yīng)當(dāng)包括應(yīng)用于本結(jié)構(gòu)的函數(shù)集以及阻止對內(nèi)部的無限制訪問。
數(shù)據(jù)封裝的應(yīng)用之一在于隱藏用戶或程序員不必了解的那些實(shí)現(xiàn)層次的細(xì)節(jié)。
比如對于一張“撲克”的花色和點(diǎn)數(shù)可以有很多種表達(dá)方式,可以用兩個(gè)整數(shù),兩個(gè)字符串或者兩個(gè)枚舉類型。而實(shí)現(xiàn)這個(gè)“撲克”類的作者需要知道如何實(shí)現(xiàn)它,使用這個(gè)“撲克”的其他人就不應(yīng)該知道它的內(nèi)部結(jié)構(gòu)了。 另外一個(gè)例子,我們之前使用apstring和apvector對象卻未曾討論過他們的實(shí)現(xiàn)方式。實(shí)現(xiàn)方式可以有很多種,但作為使用這些庫的“客戶”則不必知曉。
在C++中確保數(shù)據(jù)封裝的通常辦法是通過禁止客戶程序訪問對象的變量來實(shí)現(xiàn)的。在結(jié)構(gòu)定義時(shí)使用關(guān)鍵字private進(jìn)行保護(hù)。比如,我們有如下的“撲克”定義。
struct Card
{
private:
int suit, rank; //suit為花色,rank牌大小
public:
Card ();
Card (int s, int r);
int getRank () const { return rank; }
int getSuit () const { return suit; }
void setRank (int r) { rank = r; }
void setSuit (int s) { suit = s; }
};
該定義中分為兩個(gè)部分:私有部分和公共部分。函數(shù)是公共的,這就意味著他們可以被用戶程序調(diào)用。變量是私有的,于是他們就只能被“撲克”的成員函數(shù)進(jìn)行讀寫。
但通過訪問函數(shù)(以get和set開頭的函數(shù))可以實(shí)現(xiàn)用戶程序?qū)λ接凶兞康淖x寫。從另一方面來看,通過訪問函數(shù)就可以很容易的控制哪個(gè)操作用戶可以實(shí)施于哪個(gè)變量上。比如,讓所有的牌在創(chuàng)建之后是只讀是一個(gè)好主意。為了實(shí)現(xiàn)這個(gè)目的,我們需要做的只需移除所有的set函數(shù)。
使用訪問函數(shù)的另外一個(gè)優(yōu)點(diǎn)則是我們可以改變撲克的內(nèi)部表達(dá)形式而不必更改用戶的程序。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: