官术网_书友最值得收藏!

3.3 類與封裝

類具有封裝性。可以從兩方面認識類的封裝性:其一是類能夠把數據和算法(操作數據的函數)組合在一起,構成一個不可分割的整體;其二是類具有信息隱藏的能力,能夠有效地把類的內部數據(即私有和受保護成員)隱藏起來,使外部函數只有通過類的公有成員才能訪問類的內部數據。

封裝使類成為一個具有內部數據的自我隱藏能力、功能獨立的軟件模塊。用private把不想讓其他程序訪問的數據或函數設置為私有成員,就可以禁止其他程序對這些數據的隨意修改;用public設置一些公有成員,讓本類之外的其他函數能夠通過這些公有成員,按照類允許的方法訪問類的私有數據,實現數據保護的目的。

現在來設計一個時鐘類,借此理解類的封裝和信息隱藏。任何時鐘都是一個獨立存在的有形實體,在鐘面設置有時針、分針、秒針,人們通過這些指針查看時間,如果時間不準確,還可以通過這些指針調整時間。時鐘的內部結構和內部運行機制則被封裝在鐘表內部,人們不知道這些內部結構,也不知道時鐘的內部運行機制。(指針怎樣移動?是電流驅動還是機械驅動呢?)事實上,這些都是時鐘的事情,人們沒必要知道。

用類來抽象與封裝時鐘類,把時、分、秒設置為私有數據成員,把內部運行機制設置成私有成員函數run( ),把時鐘提供給人們的操作(如設置時、分、秒)設置成公有成員函數,用這種思想抽象得到的一個時鐘類如下:

class Clock{
  private:
    int hour,minute,second;
    void run();
  public:
    void setHour(int h) { hour=h;  }
    void setMinute(int m) { minute=m; }
    void setSecond(int s) { second=s; }
    void dispTime(){
       cout<<"Now is: "<<hour<<":"<<minute<<":"<<second<<endl;
  }
};
void Clock ::run(){
   while(1){
       if(++second>=60){
           second=0;
           if(++minute==60){
              minute=0;
              if(++hour==24)
                 hour=0;
           }
       }
       dispTime();
   }
}

圖3-1是時鐘及時鐘類的對比圖形。時鐘類把時鐘的屬性和行為封裝成一個整體,通過訪問限定符private將時鐘內部的屬性(即hour、minute、second)和行為(即時鐘運行函數run( ))設置為私有成員,這些私有成員不允許外部函數直接訪問,就好像不允許人們直接撥動時鐘的指針調整時間一樣。

圖3-1 時鐘和Clock類

通過public限定符將時鐘的接口(即顯示時間的表面,允許人們操作的時、分、秒調整旋鈕)設置成公有成員函數dispTime()、setHour()、setMinute()、setSecond(),外部函數可以調用這些函數進行時間的顯示和調整,就好像允許人們通過時鐘表面觀察時間,通過時針調整旋鈕調整時間一樣(例如,通過公有成員函數setHour()設置私有成員hour的值,就好像旋轉時針旋鈕調整小時的數值一樣)。

在Clock類中,顯露在時鐘外部可供人們查看和操作的部分就被抽象成了公有成員,隱藏在時鐘內部不為人知的部分和工作原理就被封裝成了私有成員。要想訪問Clock的私有成員,必須通過公有成員才能做到。這一點與人們只能通過時鐘的外部接口(時鐘表面的各種開關和時間調節旋鈕)才能調整時間的道理完全相同,所以類的公有成員也稱為類的接口,其意思就是,外部函數要訪問類的內部成員,只有通過類的公有成員才能實現。

主站蜘蛛池模板: 嵩明县| 武冈市| 叙永县| 威海市| 元谋县| 曲周县| 兴城市| 上栗县| 永泰县| 富裕县| 西乌珠穆沁旗| 郸城县| 南漳县| 诏安县| 福鼎市| 尼勒克县| 新邵县| 石家庄市| 梓潼县| 桐城市| 彩票| 南江县| 锡林浩特市| 绥滨县| 岑巩县| 卢氏县| 游戏| 安陆市| 泽库县| 安仁县| 客服| 泸西县| 星座| 克山县| 西平县| 渝北区| 江城| 穆棱市| 缙云县| 重庆市| 朝阳县|