簡體   English   中英

私有數據類型和成員函數

[英]Private data types and member functions

當您在C ++類中將變量或成員函數聲明為私有時,這實際上意味着什么? 除了顯而易見的事實,它們只能由成員函數訪問,它們在內存上的映射與公共函數相比有何不同?

根據標准文檔9.2.12

分配具有相同訪問控制 (第11條)的(非聯盟)類的非靜態數據成員,以便稍后的成員在類對象內具有更高的地址 未指定具有不同訪問控制的非靜態數據成員的分配順序(11)。 實施一致性要求可能會導致兩個相鄰成員不能彼此立即分配; 管理虛擬功能(10.3)和虛擬基類(10.1)的空間要求也可能如此。

該標准對內存分配的順序進行了規范,但是分配給public數據成員及其private副本的內存沒有太大區別。

想象一下,他們來自成員函數只acessible,那么這樣的代碼將打破:

class Foo {
  int x; // this is private

public:
  int& X() { return x; } // this is public, but returns a reference to a private variable
};

Foo foo;
foo.X() = 42; // look, I can set the value of a private member without being inside a member function

簡而言之,如果存在某種魔術性地強制私有變量只能由成員函數訪問的方法,那么在C ++中定義get / setter的最常用方法之一將被打破。 那顯然不好。

publicprivate可以幫助程序員構造代碼,僅此而已。 它們絕對不提供安全性,也不提供運行時保護以防止代碼訪問“私有”成員。 變量僅在源代碼中是私有的。 在編譯后的代碼中沒有區別。

class priva
{
int x=10;
public:
int pub;
};
main()
{
priva a;
int *ptr;
ptr=&a.pub;
--ptr;//4 bite be4 there will be private data
cout<<"Private data having value of 10 is "<<endl;
cout<<*ptr;
} 

除了可訪問性之外,沒有其他區別!

只有在編譯代碼之前, publicprivate才存在。 它們與運行時或內存管理無關。

暫無
暫無

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

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