簡體   English   中英

訪問說明符的c ++實現

[英]c++ implementation of access specifiers

據我了解,C++ 類中的非靜態數據成員被打包到 C 風格的結構中。 為了簡化討論,忽略虛函數和繼承,在這樣的方案中如何強制執行訪問說明符?

說一個類:

class Object
    {
public:
    int i1;
    int i2;
private:
    char i3;
    int i4;
    };

翻譯成:

struct { 
  int i1;
  int i2;
  char i3;
  int i4;
}

c++ 如何確保私有成員i3i4不能在類外訪問,而i1i2可以?

C++ 有(一些)安全措施來防止墨菲,而不是馬基雅維利。

這意味着constvolatile和 access-qualifiers在編譯時被檢查,但即使這樣也可以繞過(使用各種技巧)。

所以... C++ 不需要實現保護方案。 如果程序被編譯,它被認為是正確的(寫那些限定符)並且將在沒有運行時檢查的情況下執行。

它沒有。 繼續,執行reinterpret_cast並手動索引指針。 這與 C 和 C++ 都允許丟棄const原因相同。

然而,一般來說,這樣做是一個愚蠢的想法,C++ 通過在您以正常方式訪問時簡單地檢查修飾符來有效地強制執行訪問修飾符。

C++ 是一種靜態類型語言。 同樣,C++ 中的許多概念也經過靜態檢查。 具體來說,訪問說明符是在編譯時檢查的。

該標准對類的成員在內存中的布局方式提供了一些保證。 最有用的是在同一訪問說明符部分中一起指定的成員將按指定的順序可用。 (例如,這個特性對於訪問網絡數據包非常有用。)

為了回答您的問題,沒有對結構的“翻譯”(結構是一個退化類,其中默認訪問是公共而不是私有的)。 訪問說明符在編譯時強制執行。 訪問說明符沒有運行時強制執行。

你的來源是什么? 我認為它指的是對象在內存中的表示方式,但處理訪問說明符的是編譯器,而不是運行時。

在內存中,一個class可能看起來和一個struct ,但對於編譯器來說它們不是。

此外,即使在內存中,兩者也不必等效(就像它們對編譯器不等效一樣)。 編譯器可以重新排列成員,只要它將那些沒有交錯訪問說明符的成員組合在一起。 所以,在記憶中,

class Object {  
public: 
   int i1; 
   int i2; 
private: 
   char i3; 
   int i4; 
};

理論上可以表示為

struct {
   char i3;
   int i4;
   int i1;
   int i2;
}

請注意,我在這里只討論內存布局。 你的類的實際struct等價物是:

struct Object {  
private:
public: 
   int i1; 
   int i2; 
private: 
   char i3; 
   int i4; 
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM