c++對象類型筆記:private,protected,public

面試的時候經常有人問:c++中,怎麼才能不通過public函數來取得private的數據成員?

當然,答案很多,比如如下的兩個方法:

1)、#define private public; #define class struct
(可以在編譯環境裏面添加宏(包括gcc和vs2005乃至於其他編譯器),具體方法google上搜啊,這篇筆記不是講具體操作的)

2)、寫一個和類A一模一樣的結構體AStruct,刪了所有的權限符號

  1. class A
  2. {
  3. private:
  4.     int a;   //要訪問a,怎麼辦
  5. };

  6. struct AStruct 
  7. {
  8.     int aS;
  9. };

  10. A aA;
  11. //關於指針類型轉換可以參考筆記“筆記之:指針類型轉換”
  12. struct AStruct *pAStruct = (struct AStruct*)&aA;

  13. pAStruct->aS = 8;  //其實是aA.a = 8,也就是訪問了A中的私有數據int a



這些做法都可以,但是,

這背後說明了什麼?

這個技術問題的用意何在?

不知各位有沒有想過?

其實,這個privatepublic,和protected,乃至於conststaticinline等關鍵字,只是在編譯時候起作用!換句話說,在程序運行的時候,類A的對象a已經沒有關於這些權限方面的信息,就剩下成員變量的空間佈局了!所以,那個AStruct *p = (AStruct *)&a; 才能成功,才能在運行時候訪問a中的私有成員。

至於第一種方法,也是一個道理,因爲這些訪問權限符沒有佔據連接和運行期間的任何細節,所以假設類A在類庫裏面提供的是目標文件,在使用A的時候,可以在A 聲明的頭文件裏面使用#define class struct, #define private public來訪問A的私有成員,在連接和運行階段一樣的通過,技術人員問這個問題也就是這個目的--瞭解你對c++的編譯和運行機制的原理知道了多少。

爲什麼編譯器不增加一些運行時候的保護機制呢?不是不可以,其實c++標準裏面也沒有規定如何實現,但是由於市場經濟的作用,每個編譯器廠商互相競爭的結果,又加上c++語言的目標是在兼容c的基礎上儘量達到c的效率;由於要儘量兼容c,所以在運行的內存上面不能增加太多的東西(想想一個vptr已經讓 c++罵聲不斷了,還敢再添啊,開開玩笑,呵呵);由於要高效,所以也不能添加太多的保護操作(這個和數組沒有越界訪問是一個道理)

結論就是:privatepublicprotected都是編譯期間起的作用,過了編譯階段,生成目標文件,這些信息就消失的無影無蹤。因此上面的方法才能生效。

所以,如果在用某個類庫的時候,如果嫌那些私有成員的訪問太麻煩(是有點麻煩,整天的寫get/set一大堆~~),用#define就可以直接訪問了,不過,如果由於你的上司看到了你這麼做而造成的任何後果,你可不要怪在下~。區區在下是不負責的,哈哈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章