【c++】private裏面的變量可以直接訪問和修改嘛?

五月出差頻繁

只有趁着週末不加班拿出一點時間記錄下最近學到的東西~

——————————————下面是正文————————————————

我們都知道,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裏面的變量!

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