C/C++—— 除了用類成員函式訪問類私有成員變數外,還可以通過類物件地址來直接訪問和修改類的私有成員變數
除了用類成員函式訪問類私有成員變數外,還可以通過類物件地址來直接訪問和修改類的私有成員變數
/*************************************************************************
> File Name: visit_private_data.cpp
> Author:
> Mail:
> Created Time: 2016年03月21日 星期一 20時10分37秒
************************************************************************/
#include <iostream>
#include <string>
using namespace std;
class People{
private:
int num;
int age;
int hight;
string name;
public:
People(){}
People(int n, int a, int h, string na):num(n), age(a), hight(h), name(na){}
~People(){}
int get_num(){return num;}
int get_age(){return age;}
int get_hight(){return hight;}
string get_name(){return name;}
void set_num(int val){num = val;}
void set_age(int val){age = val;}
void set_hight(int val){hight = val;}
void set_name(string val){name = val;}
};
int main()
{
People p1(1, 22, 170, "linux");
cout << "p1.num = " << p1.get_num() << endl;
cout << "p1.age= " << p1.get_age() << endl;
cout << "p1.hight = " << p1.get_hight() << endl;
cout << "用地址訪問類的私有成員變數: " << endl;
int* p = (int*)&p1;
cout << "*p = " << *p << endl;
cout << "*(p+1) = " << *(p+1) << endl;
cout << "*(p+2) = " << *(p+2) << endl;
*p = 11;
cout << "after *p = 11, *p = " << *p << endl;
cout << "用地址輸出類物件的前20個位元組的值: " << endl;
char* ptr = (char*)&p1;
for(int i = 0; i < 20; ++i){
cout << "*(ptr+" << i << ") = " << *(ptr+i) << endl;
}
return 0;
}
輸出結果:
p1.num = 1
p1.age= 22
p1.hight = 170
用地址訪問類的私有成員變數:
*p = 1
*(p+1) = 22
*(p+2) = 170
after *p = 11, *p = 11
用地址輸出類物件的前20個位元組的值:
*(ptr+0) =
*(ptr+1) =
*(ptr+2) =
*(ptr+3) =
*(ptr+4) =
*(ptr+5) =
*(ptr+6) =
*(ptr+7) =
*(ptr+8) = (ptr+9) =
*(ptr+10) =
*(ptr+11) =
*(ptr+12) =
*(ptr+13) =
*(ptr+14) =
*(ptr+15) =
*(ptr+16) = (
*(ptr+17) = (ptr+18) = (ptr+19) =
可以通過該測試例子得到類的基本成員變數在記憶體中的分佈,但是還不能看到string name成員物件在該People類物件中的分佈。以後肯定還會有其它的書籍會講到。
相關文章
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- C++派生類物件訪問基類的protected成員C++物件
- ⦁ 類的私有成員
- 既然Java反射可以訪問和修改私有成員變數,那封裝成private還有意義麼?Java反射變數封裝
- C++ 突破私有成員訪問限制C++
- c# 基類派生類成員方法訪問C#
- Java中類的成員方法和變數的訪問許可權Java變數訪問許可權
- 使用類繼承還是類的成員變數繼承變數
- C++ 類成員函式C++函式
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式
- C++:類的成員函式C++函式
- 類,物件,成員變數和區域性變數,匿名物件物件變數
- 通過反射獲取類的類名,方法和內部成員變數反射變數
- C#訪問或修改私有類、函式、變數、屬性C#函式變數
- Java訪問類變數Java變數
- C++類內成員變數可以定義引用型別嗎C++變數型別
- C++類的靜態成員變數初始化C++變數
- 子父類中成員變數變數
- 類成員變數的初始化變數
- 淺談C++指標直接呼叫類成員函式C++指標函式
- Java 通過反射獲取類的資訊(成員變數,成員方法,構造方法)Java反射變數構造方法
- Java類的設計和封裝及類成員的訪問控制Java封裝
- C++共享之道:用extern實現原始檔變數與類成員函式的巧妙共享C++變數函式
- 函式指標使用c++類成員函式函式指標C++
- 類的靜態成員變數和普通成員變數該怎樣去區別定義變數
- C++類中的常成員和靜態成員C++
- c#繼承父子類成員間的互訪問性C#繼承
- 『無為則無心』Python物件導向 — 51、私有成員變數(類中資料的封裝)Python物件變數封裝
- java類成員中的訪問級別有哪些Java
- C++ 類成員指標C++指標
- C++類靜態成員C++
- 類的成員變數的初始化順序變數
- C++程式設計學習筆記:2 類和物件初探 內聯成員函式和過載成員函式C++程式設計筆記物件函式
- c++類的靜態成員C++
- C++:類的靜態成員C++
- C++ 類的靜態成員C++
- Python中類變數、成員變數、區域性變數的區別Python變數
- c++類别範本成員函式報錯C++函式