五月出差頻繁
只有趁着週末不加班拿出一點時間記錄下最近學到的東西~
——————————————下面是正文————————————————
我們都知道,C++中有一個叫訪問權限的知識點
被定義在“private"中的方法或者對象理論上是無法直接訪問的
被定義在“public"中的方法或者對象理論上是可以訪問的
用以下一個簡單的類來說明:
#include<iostream>
class change
{
private:
int x;
public:
int y;
};
void main()
{
change c;
c.y = 10;
std::cout<<c.y<<std::endl;
}
當直接爲類中的變量”y“賦值時,編譯器能夠正常通過,並且將值正確地賦值在”y“所在的內存裏面。
而當爲”x“賦值時,編譯器就會報錯:
編譯器會爆出:”x“變量爲private成員,不能修改。
如果一定要修改的話,其實我們可以在類裏面添加一個函數,在函數裏面修改private裏面的變量:
#include<iostream>
class change
{
private:
int x;
public:
int y;
void init(int x);
};
void change::init(int x)
{
this->x = x;
std::cout<<"x = "<<this->x<<std::endl;
}
void main()
{
change c;
c.y = 10;
c.init(3);
std::cout<<"y = "<<c.y<<std::endl;
}
顯示結果正常:
一般人到了這裏一般都會死心放棄繼續探究下去
但是我是那種人嗎??我可是用頭髮去換知識的人咧!!
private裏面的變量真的不可以訪問嗎?
其實只要C/C++基礎紮實的編程員都知道,C/C++的靈魂是啥?是指針。
我們在訪問變量的時候都是通過指針來進行訪問的,也就是說我在試圖修改private裏面的變量時候編譯器報出的錯誤不是因爲指針不能指向那個變量,而是因爲編譯器不允許我們訪問那個變量!
所以,簡單來說,我們只要繞開編譯器的訪問權限,不用編譯器提供的指針,用我自己的指針去調出private中的變量,不就可以訪問private裏面的變量了嗎?
綜合以上結論,現在來試探性地實驗一下:
第一:爲兩個變量賦值,並且添加斷點,觀察堆棧變化
在圖下可以看到,類的首地址前8個字節填滿了CCCCCC,是堆棧清理垃圾數據的正常結果:
然後對private中的變量”x“和public中的變量”y“進行賦值,可以看到:類的前8個字節出現了變化,兩個變量的賦值存到了裏面去:
第二步:大膽猜測private中的變量”x“中所存的值可以中類的首地址去代表,並且可以用指針去指向並且訪問。
實驗代碼如下:
#include<iostream>
class change
{
private:
int x;
public:
};
void main()
{
change c;
int* p = (int*)&c;
*p = (int)5;
int x = *p;
std::cout<<"x = "<<x<<std::endl;
}
結果顯示正常,並且成功修改和訪問了private裏面的變量!