- C++面向對象程序設計
- 杜茂康等編著
- 1065字
- 2019-01-01 05:54:57
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的私有成員,必須通過公有成員才能做到。這一點與人們只能通過時鐘的外部接口(時鐘表面的各種開關和時間調節旋鈕)才能調整時間的道理完全相同,所以類的公有成員也稱為類的接口,其意思就是,外部函數要訪問類的內部成員,只有通過類的公有成員才能實現。