2010-04-14 47 views
0

默認情況下,結構的成員是公開的,默認情況下,類的成員是私有的。我們可以通過正確的渠道訪問私人數據成員(使用成員函數)。如果我們有機會獲得成員函數我們可以看到在私有數據成員/寫數據,所以它的安全性如何......我們正在訪問它,我們正在改變數據太.....類比結構更安全嗎?

+2

我沒有看到問題。顯然,如果你提供了一個會員的訪問權限,你不應該認爲該會員非常私人了。如果你希望它是私人的,不要提供給它一個成員。 – GManNickG 2010-04-14 07:46:59

+0

@GMan:問題在標題中。 – sbi 2010-04-14 08:00:17

+0

@sbi但是,這個問題的答案載於本體。現在提出的問題是同義反復的。他將「安全」定義爲無法修改字段,然後繼續說默認情況下類中的字段是私有的,但是如果創建Set(...)方法,則無論如何都可以修改它們。好的,那是什麼? _不要創建它,並且該字段將保持「安全」! – 2010-04-14 08:42:34

回答

3

主要是因爲成員函數可以在存儲它們之前驗證這些值。例如,假設你有一個名爲「年齡」的字段,該字段必須介於0到150之間。在一個結構(或具有公共字段的類)中,您可以僅執行obj.age = 200。而如果你只有一個setAge(int)方法,那麼在存儲之前,該方法可以理智地檢查值在0和150之間,如果有必要可能拋出異常,或者如果不是,則只是鉗位該值。

+1

其他:在C#中,您可以使用屬性,在設置它之前可以檢查該值。 – RvdK 2010-04-14 07:49:52

+0

非常感謝先生 – 2010-04-14 07:52:44

4

訪問說明,如privatepublic無關安全。例如,在C++中,這些規範會被編譯掉,甚至不存在於編譯後的二進制文件中。

相反,訪問說明旨在使類型易於正確使用,而難以錯誤使用。

+0

這也可以在結構中完成,那麼什麼是類的需要.... – 2010-04-14 07:57:27

+0

@Asad Hanif:沒有必要。類和結構之間唯一的區別在於'struct'的成員默認是公共的。使用關鍵字'class'鼓勵你創建更多'private'類的數據成員,這是很好的設計。另外,當我們談論這些事情時,除非它是C風格的POD類型,否則即使它是用'struct'關鍵字聲明的,我們也會將它稱爲類,而不是結構。但是從語法上來說,所有'class'都可以用'struct'完成。 – 2010-04-14 08:02:25

+0

多謝先生 – 2010-04-14 08:15:39

1

public/private/protected關鍵字不是爲了安全而是爲了封裝。你可以通過從接口中分離實現(其中使用了私有/受保護成員 - 實際用於實現功能的實現)來設計你的類,其中公開成員 - 該類的用戶 - 其他對象 - 將訪問/調用),因此您稍後可以在不更改界面的情況下更改私人部分。外部對象只需要瞭解公衆成員並安全地使用它們,而不管執行情況如何。 如果你正在談論安全問題,認爲任何人都可以改變班級的私人成員,如果他們真的想要知道班級的內部結構,只需用新的值覆蓋適當的內存位置 - 但這裏的問題不是有關安全性,它是在一個較低的水平

4

只有兩個classstruct之間語法上的不同:

  1. class,成員默認都是private,而在struct,他們是public默認。
  2. 由於歷史原因,class可以被用來代替typename聲明一個模板類型參數。

事實上,有

struct X { 
    void f() {} 
private: 
    int i; 
}; 

class Y { 
    int i; 
public: 
    void f() {} 
}; 

一個class更「安全」比struct是它輕輕「按下」你唯一的辦法沒有區別通過默認爲private成員來更好地封裝。

有真的沒有必要引入一個新的關鍵字class,斯特勞斯自己說,有幾次。 (看他的書的C++如果你有興趣在這些事情的設計與演變。)基本上,class引入強調的事實,與成員函數struct是不是一個真正的「結構」中不再的方式術語用於C:一組鬆散耦合的內置類型的對象。從術語用於靜態類型的面向對象的語言來看,它是一個「類」,儘管在句法上是,但它與struct沒有實質性區別。

1

考慮到除了默認訪問,類和結構完全相同,問題是如何從接口封裝內部表示有助於構建更健壯的代碼。

主要區別在於,您可以控制何時以及如何修改類數據,因此您可以控制類不變量。考慮一個簡單的矢量類,它有一個指針和一個大小。通過讓它們變爲私有,您可以控制它們的變化:如果調用resize方法,指針和內部大小變量將被連貫地更新,從而保持訪問範圍[0..size)中的任何位置的固定不變。如果成員屬性是公共的,用戶代碼將更新存儲或大小而不實際更新其他字段,並且該不變性可能被破壞。

許多類都有正確用法的內部不變量。如果您編寫的類包含帶有用戶電子郵件地址的字符串,那麼通過提供訪問方法,您可以控制傳入的值是否爲有效的電子郵件地址,而如果電子郵件字段是公共用戶代碼,則可以將其重置爲任何內容...

整體而言,您可以控制您的成員如何被訪問和修改,從而減少可能出現錯誤的位置數量和/或檢測到錯誤的機會。