1. 程式人生 > >C++老鳥日記021 C++訪問控制及其目的或作用

C++老鳥日記021 C++訪問控制及其目的或作用

星點課堂提供,作者:女兒叫老白

微信公眾號: 星點課堂

新浪微博:女兒叫老白

網易雲課堂:女兒叫老白

網易雲課堂免費課程:《C++跨平臺開發中的編譯錯誤》

網易雲課堂免費課程:《C++老鳥日記》

----------------------------------------------------------------------------

(5.1)

引言:

----------------------------------------------------------------------------

       我們在前面的章節討論過,struct的成員預設是public,class的成員預設是private。protect的成員可以被派生類訪問,而無法被類物件訪問。那麼關於訪問控制,我們還應該知道點什麼呢?

正文:

----------------------------------------------------------------------------

       訪問控制的目的就是為了隱藏實現。因為不是所有的成員都允許被外部訪問,所以才有了訪問控制。試想一下,本來是通過介面進行訪問的成員變數,被派生類在任意位置修改,而該介面卻一無所知是不是很不好?況且,該介面可能還要做一些額外的處理(比如,加鎖,或者在該成員變數被修改後觸發某個訊息),這樣的化,該類物件的狀態可能已經超出了設計者的控制範圍。因此,通過介面來訪問成員變數是很必要的,對成員設定訪問控制權限也同樣是非常重要的。而我們在設計一個類的時候,往往想不了這麼多,經常是想到啥就寫啥,用到某個功能就為類寫一個介面。事後才會發現,這些介面不該這樣隨意的暴露出去。因此,設定邊界是很重要的,我們只將需要的介面開放給使用者,而把細節隱藏起來。這樣使用者就只關心他呼叫的介面而無需關心內部到底發生了什麼;我們也無需擔心使用者把手伸到我們內部來搗亂,因為有訪問控制。這就好比本來我們提供了電視機遙控器,而有人偏偏想直接對電視機的電路板進行操作或處理來更換頻道一樣,這可不是我們設計者希望看到的。

       在多執行緒應用中,如果多個執行緒都訪問同一個類物件,而該類的成員變數又是public限定符,那麼當執行緒A修改完類的成員變數後,執行緒B可能馬上就把它改成另一個值,這時候,執行緒A還不知道呢。甚至還有可能因為多執行緒同時修改一個變數導致應用程式崩潰。所以,還是以面向物件的思想進行程式設計吧,把對成員變數的訪問封裝在介面中,如果必要的化,加上鎖進行保護。

       友元衝破了訪問控制的限制,如果一個類A被宣告為類B的友元,那麼它就可以訪問類B的private成員。這樣做給類A開放了非常大的許可權,因此我們對友元類持謹慎使用的態度。

結語:

----------------------------------------------------------------------------

       C++訪問控制為面向物件程式設計提供了良好的語法基礎,我們應充分利用。直接把類的成員變數暴露給使用者是不明智的行為,尤其在多執行緒應用中更是如此,使用友元時要慎之又慎。