默認情況下,結構的成員是公開的,默認情況下,類的成員是私有的。我們可以通過正確的渠道訪問私人數據成員(使用成員函數)。如果我們有機會獲得成員函數我們可以看到在私有數據成員/寫數據,所以它的安全性如何......我們正在訪問它,我們正在改變數據太.....類比結構更安全嗎?
回答
主要是因爲成員函數可以在存儲它們之前驗證這些值。例如,假設你有一個名爲「年齡」的字段,該字段必須介於0到150之間。在一個結構(或具有公共字段的類)中,您可以僅執行obj.age = 200
。而如果你只有一個setAge(int)
方法,那麼在存儲之前,該方法可以理智地檢查值在0和150之間,如果有必要可能拋出異常,或者如果不是,則只是鉗位該值。
其他:在C#中,您可以使用屬性,在設置它之前可以檢查該值。 – RvdK 2010-04-14 07:49:52
非常感謝先生 – 2010-04-14 07:52:44
訪問說明,如private
和public
無關安全。例如,在C++中,這些規範會被編譯掉,甚至不存在於編譯後的二進制文件中。
相反,訪問說明旨在使類型易於正確使用,而難以錯誤使用。
這也可以在結構中完成,那麼什麼是類的需要.... – 2010-04-14 07:57:27
@Asad Hanif:沒有必要。類和結構之間唯一的區別在於'struct'的成員默認是公共的。使用關鍵字'class'鼓勵你創建更多'private'類的數據成員,這是很好的設計。另外,當我們談論這些事情時,除非它是C風格的POD類型,否則即使它是用'struct'關鍵字聲明的,我們也會將它稱爲類,而不是結構。但是從語法上來說,所有'class'都可以用'struct'完成。 – 2010-04-14 08:02:25
多謝先生 – 2010-04-14 08:15:39
public/private/protected關鍵字不是爲了安全而是爲了封裝。你可以通過從接口中分離實現(其中使用了私有/受保護成員 - 實際用於實現功能的實現)來設計你的類,其中公開成員 - 該類的用戶 - 其他對象 - 將訪問/調用),因此您稍後可以在不更改界面的情況下更改私人部分。外部對象只需要瞭解公衆成員並安全地使用它們,而不管執行情況如何。 如果你正在談論安全問題,認爲任何人都可以改變班級的私人成員,如果他們真的想要知道班級的內部結構,只需用新的值覆蓋適當的內存位置 - 但這裏的問題不是有關安全性,它是在一個較低的水平
只有兩個class
和struct
之間語法上的不同:
- 在
class
,成員默認都是private
,而在struct
,他們是public
默認。 - 由於歷史原因,
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
沒有實質性區別。
考慮到除了默認訪問,類和結構完全相同,問題是如何從接口封裝內部表示有助於構建更健壯的代碼。
主要區別在於,您可以控制何時以及如何修改類數據,因此您可以控制類不變量。考慮一個簡單的矢量類,它有一個指針和一個大小。通過讓它們變爲私有,您可以控制它們的變化:如果調用resize
方法,指針和內部大小變量將被連貫地更新,從而保持訪問範圍[0..size)中的任何位置的固定不變。如果成員屬性是公共的,用戶代碼將更新存儲或大小而不實際更新其他字段,並且該不變性可能被破壞。
許多類都有正確用法的內部不變量。如果您編寫的類包含帶有用戶電子郵件地址的字符串,那麼通過提供訪問方法,您可以控制傳入的值是否爲有效的電子郵件地址,而如果電子郵件字段是公共用戶代碼,則可以將其重置爲任何內容...
整體而言,您可以控制您的成員如何被訪問和修改,從而減少可能出現錯誤的位置數量和/或檢測到錯誤的機會。
- 1. web.config比類更安全嗎?
- 2. 擴展Windows API結構安全嗎?
- 3. 有比serialize()更安全的方法嗎?
- 4. web.config比數據庫更安全嗎?
- 5. 類型安全的階層式結構
- 6. 如何cout比printf更類型安全()
- 7. 使用PDO類InDirectly更安全嗎?
- 8. Java安全體系結構
- 9. 對於「構件」樹結構,比`shared_ptr`更好的選項嗎?
- 10. 與`seq`相比``評估'安全嗎?
- 11. 是天真地解析一個JSON到一個Python類或結構安全嗎?
- 12. callstack是一種語言安全的數據結構嗎? Quasar + Fortran?
- 13. 在java中自定義數據結構線程安全嗎?
- 14. go map結構是線程安全的嗎?
- 15. 正在轉換爲嵌套結構指針安全嗎?
- 16. 創建我自己的SDL Event結構安全嗎?
- 17. Flash/Actionscript比Javascript更安全的在線遊戲嗎?
- 18. 存儲過程比使用LINQ對數據庫更安全嗎?
- 19. 兄弟兄弟比父親孩子更安全嗎?
- 20. Gradle依賴關係比將庫下載到庫更安全嗎?
- 21. 對於REST服務,api.domain.com比domain.com/api更安全嗎?
- 22. 移動分支指針比`git reset --hard`更安全嗎?
- 23. IS Json_encode()比PHP中的序列化更安全嗎?
- 24. 虛擬函數比函數指針更安全嗎?
- 25. 在ASP.NET MVC中比隱藏表單字段更安全嗎?
- 26. Crypt和Salt對於暴力攻擊比MD5更安全嗎?
- 27. Whilh SQL結構更好嗎?
- 28. 類比CssClass更快嗎?
- 29. Angular和Spring安全體系結構
- 30. 安全節點的數據結構?
我沒有看到問題。顯然,如果你提供了一個會員的訪問權限,你不應該認爲該會員非常私人了。如果你希望它是私人的,不要提供給它一個成員。 – GManNickG 2010-04-14 07:46:59
@GMan:問題在標題中。 – sbi 2010-04-14 08:00:17
@sbi但是,這個問題的答案載於本體。現在提出的問題是同義反復的。他將「安全」定義爲無法修改字段,然後繼續說默認情況下類中的字段是私有的,但是如果創建Set(...)方法,則無論如何都可以修改它們。好的,那是什麼? _不要創建它,並且該字段將保持「安全」! – 2010-04-14 08:42:34