C 中直接訪問類私有成員 360度

2021-04-02 14:30:24 字數 1349 閱讀 7316

本文談到的問題是,在c++中究竟有沒有辦法訪問類的私有成員,以及如何實現。主要針對菜鳥,老鳥們就不要看了。

讀到《c++程式設計思想》48頁,「3.4 物件布局」一節時,看到這樣一段話:

訪問指定符是struct的一部分,他並不影響這個struct產生的物件,程式開始執行時,所有的訪問指定資訊都消失了。訪問指定資訊通常是在編譯期間消失的。在程式執行期間,物件變成了乙個儲存區域,別無他物,因此,如果有人真的想破壞這些規則並且直接訪問記憶體中的資料,就如在c中所做的那樣,那麼c++並不能防止他做這種不明智的事,它只是提供給人們乙個更容易、更方便的方法。

既然是在編譯期間去掉了所有的訪問限制屬性,那麼能不能設計一段**繞過編譯器的檢查機制,又能在執行期間訪問類的私有成員呢? 首先想到了條件轉移語句——編譯器對條件轉移**塊的編譯是否有可利用之處呢?雖然實驗失敗了,但我的第一想法確實是這個。示例**如下:

//tester.h

//demo class

class tester

;private:

int i;

char ch;

};//test1.cpp

//demo testing code

#include "tester.h"

#include

#include

using namespace std;

void main(void)

cout << "address of ch = " << (void*) p << endl; //the type modifier void* forces it to output the

//address, not its  content

cout << "ch = " << * (p) << endl;

getch();  //waits your action

* p = 'y';

cout << "now ch = " << * (p) << endl;

}結果正如上面所說,失敗了:編譯器報錯:error c2248: 'ch' : cannot access private member declared in class 'tester'。不過這引發了更深一步的思考。c語言裡面最活的就是指標了,平常最怕亂指的野指標,這一次就試試它!修改後的測試**如下:

//test2.cpp

//demo testing code

#include "tester.h"

#include

#include

using namespace std;

void main(void)

檢視輸出後可以發現,ch的內容已經修改了。不過通過指標強行訪問類的私有成員確實有點那個,嘿嘿。

C 私有成員變數被物件直接訪問

c 訪問控制 關鍵字private,它描述了對類成員的訪問控制。使用類的物件方法可以直接訪問私有成員函式和變數。類的物件即例項只能通過公共成員函式來訪問私有變數和私有成員函式。因此公有成員函式成為物件的私有變數訪問的橋梁。在c 中,在類的成員函式的引數為此類型別時,可以通過類型別的物件直接訪問私有成...

C 中訪問私有成員

首先我必須承認訪問乙個類的私有成員不是什麼好做法。大家也都知道私有成員在外部是不能被訪問的。而乙個類中會存在很多私有成員 如私有字段 私有屬性 私有方法。對於私有成員訪問,可以套用下面這種非常好的方式去解決。private string name public string name set 但是有...

C 中訪問私有成員

首先訪問乙個類的私有成員不是什麼好做法。大家都知道私有成員在外部是不能被訪問的。乙個類中會存在很多私有成員 如私有字段 私有屬性 私有方法。對於私有成員造訪,可以套用下面這種非常好的方式去解決。private string name public string name set 但是有時候,源 是別...