類成員的保護方式

2021-05-17 21:56:17 字數 1963 閱讀 3798

定義類,就是將該類的字段、屬性、事件、方法(類中的函式和過程)封裝在類的內部。這些字段、屬性、事件、方法就是類的成員。就物件而言,也是物件的資料和成員。類成員的保護模式也就是類成員訪問時的可見性,對於這些資料和成員的訪問,有以下四種保護(訪問)模式,分別使用下列關鍵字:

1、private(私有的)

在private部分宣告的成員是私有的,它們只能被同一類中的方法訪問。其它類是保密、封閉的,不能隨總意訪問它。但是,private成員保護並不嚴格,如果相關類的宣告放在同一模組中(即同乙個單元檔案中),這些類就可以訪問同模組的其它類的private成員。通過對私有成員的限制,可以更好地封裝和保護自己的類。

2、public(公有的)

在public部分宣告的成員是公有的,它們可以被其它類的物件例項訪問引用。其成員完全可以被訪問,可見性最大。雖然該成員使用方便、不受限制,但在程式設計中不能濫用。通常在設計中,應該保持該成員簡明,並盡早定義使之穩定。因為public成員作為公共介面顯然會在很多地方用到,設計不慎既會對使用該介面的其他類帶來影響,又會威脅到自身類的封裝性。

3、protected(保護的)

在protected部分宣告的成員是保護性私有的,它們不僅能被同一類中的方法訪問,還可由其子(派生)類中也可訪問和引用。

4、published(公布的)

在published部分宣告的成員是公有的,它們不僅能被同一類中和其子(派生)類中訪問和引用,其它類中也可訪問和引用。

公布屬性的資料型別是受限制的。有序型、字元型、類、介面和方法指標可以被公布。當集合型別的基礎型別是有序型別,且上界和下界介於0到31時,集合型別也可以公布的。集合只要符合byte、word、double word,(除了real48外)任何實數型別都是可以公布的;而陣列型別的屬性(區別於陣列屬性)不能公布的。

一些屬性雖然可以公布,但不能完全支援流系統,它們包括:記錄型別的屬性、所有可公布的陣列屬性,以及包含匿名值的列舉型別的屬性。如果published屬性屬於上述的型別,在object inspector中則不能正確顯示這些屬性,並且使用流向磁碟操作時也不能儲存它們的值。

所有的方法都是可以公布的,但乙個類不能使用相同的名字公布兩個或兩個以上的的被過載的方法。只有當資料成員屬於類或介面型別時,它才是可以公布的。

上述種種限制,是因為published宣告編譯器儲存vmt中的資訊,也就是說只有特定型別的可以儲存。當使用者不需要使用vmt資訊時,使用public宣告效果相同。

5、automated:這個關鍵字delphi2以上版本已不使用,保留它,就是要與delphi2**相相容。

由automated宣告的類的成員,類似於public部分宣告的成員。它們都是公共的,唯一區別是,由automated宣告的方法和屬性將生成ole自動化操作的型別資訊。

注意:public成員和published成員具有相同的可見性,不同之處是published成員會產生rtti(runtime type infomation,執行期型別庫)。rtti使應用程式能動態地查詢乙個物件的資料成員和屬性,也能定位它的方法。rtti用於在儲存檔案和檔案匯入時訪問屬性的值,也可用於在object inspector中顯示屬性,並且能為一些屬性(即事件)關聯特定的方法(即事件的處理程式)。

在delphi中,在類宣告中使用保護模式,其語法格式:

type 類名=class(基類)

private

public

protected

published

end;

注意:上述宣告中,預設保護模式關鍵,預設使用關鍵字public。(當在狀態下編譯類時,保護方式是published)。類可以有任何數目的字段,欄位後跟方法和屬性的宣告。方法和屬性的宣告可以混合在一起。但是在一種保護模式中,欄位的宣告必須在所有方法和屬性的宣告之前。

在類的繼承關係中,派生類可以通過重新宣告來變更類成員的保護模式,但這種變更只能增加成員的可見性,不能降低它的可見性。比如,乙個protected屬性在派生類中能被變更為public,但不能改為private。另外,published成員在派生類中不能改為public。

類的設計與受保護的成員

以下是c primer中文版中對類的設計關鍵概念的總結,是精髓,要好好理解,原文如下 不考慮繼承的話,我們可以認為乙個類有兩種不同的使用者 普通使用者和實現者。其中普通使用者編寫的 使用類的物件,這部分 只能訪問類的公有 介面 成員 實現者則負責編寫類的成員和友元 成員和友元既能訪問類的公有部分,也...

C 類成員函式的儲存方式 C 類成員

對於類的大小,我們發現類內成員函式並不存在於類的儲存空間。這引發了我們的思考,類中的函式成員儲存在什麼地方?資料成員每個物件會有乙份,函式成員會不會也是這樣呢?include using namespace std class time private int hour int minute int...

類的成員函式的儲存方式

includeusing namespace std class box void display private int length int width int height int main box box1 cout 在這裡需要說明 1 無論在類體內定義函式,還是在類體外定義函式,函式的 段...