C++ 私有數(shù)據(jù)和私有類

2023-03-20 16:49 更新

本書之前提到了“封裝”的概念,即指將一系列指令放在一個(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á)形式而不必更改用戶的程序。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號