C++ 訪問控制與封裝
目前我們實(shí)現(xiàn)了定義類的接口,但是還沒有任何機(jī)制強(qiáng)制用戶使用這些接口,我們的類還沒有封裝,也就是說用戶可以直達(dá)Sales_data對(duì)象的內(nèi)部,并且控制它的具體實(shí)現(xiàn),在C++中,我們使用訪問說明符加強(qiáng)類的封裝性
定義在public說明符后的成員在整個(gè)程序可以被訪問,public成員定義類的接口
定義在private說明符之后的成員可以被類的成員函數(shù)訪問,但是不能被使用該類的代碼訪問,private部分封裝了(隱藏了)類的實(shí)現(xiàn)細(xì)節(jié)
作為接口的一部分,構(gòu)造函數(shù)和部分成員函數(shù)緊跟在public說明符之后,而數(shù)據(jù)成員和作為實(shí)現(xiàn)部分的函數(shù)則跟在private說明符之后。
一個(gè)類對(duì)訪問說明符的數(shù)量沒有限制,其有效范圍直到下一個(gè)說明符出現(xiàn)或者類的結(jié)尾為止。
使用class或struct關(guān)鍵字
在上面定義中我們使用了class而非struct這種變化僅僅是形式上有所不同,這兩個(gè)定義唯一的區(qū)別就是默認(rèn)訪問權(quán)限不同。
類可以在他的第一個(gè)訪問說明符之前定義成員,對(duì)這種成員的訪問權(quán)限依賴于類定義的方式,如果我們使用struct則第一個(gè)訪問說明符之前的成員時(shí)public相反如果時(shí)class,那么就是private。
友元
既然Sales_data的數(shù)據(jù)成員是private的,我們的read、print和add函數(shù)也就無法正常編譯了,盡管這個(gè)幾個(gè)函數(shù)是類的接口的一部分,但是他們不是類的成員。
類可以允許其他類或函數(shù)訪問它的非公有成員,方法是令其他類或者函數(shù)成為他的友元,如果想把一個(gè)函數(shù)作為他的友元,只需要增加一條以friend關(guān)鍵字開始的函數(shù)聲明語句即可。
友元只能出現(xiàn)在類定義的內(nèi)部,具體位置不限,友元不是類的成員也不受他所在區(qū)域訪問控制級(jí)別的約束。我們一般集中聲明友元。
關(guān)鍵概念:封裝的益處
封裝有兩個(gè)重要優(yōu)點(diǎn)
1 確保用戶代碼不會(huì)無意間破壞封裝對(duì)象的狀態(tài)
2 被封裝的類的具體實(shí)現(xiàn)細(xì)節(jié)可以隨時(shí)改變,而無需調(diào)整用戶級(jí)別的代碼
友元的聲明
友元的聲明僅僅只定了訪問的權(quán)限,而非一個(gè)通常意義上的函數(shù)聲明,如果我們希望類的用戶能夠調(diào)用某個(gè)友元函數(shù),那么我們就必須在友元聲明之外再次對(duì)函數(shù)進(jìn)行一次聲明,為了是友元對(duì)類的用戶可見,我們通常把友元的聲明和類本身放置在同一個(gè)頭文件中,因此我們的Sales_data頭文件應(yīng)該為read、print和add提供獨(dú)立的聲明。