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