c++中this指針(閒的無聊)

c++中結構體和類的區別

有人可能認爲c++中的類和結構體相差很大,其實兩者相差不大。那爲什麼我們初學c++的人會認爲差別很大呢。
其實大多數人學c++之前一定學過C語言,而C語言中的結構體和c++中的結構體差別很大,c++中的結構體不像C語言,c++中的結構體和類唯一差別,就是默認的訪問權限不同,類默認訪問權限是私有的(private)而結構體的默認訪問權限時公共的(public),除此之外,幾乎沒有區別。c++中結構體也可以定義函數,也可以設值訪問權限,和c語言差別很大。

c++中this指針

最近學c++時學到了一個this指針。我們知道在創建一個類時,屬性和行爲是分開存儲的(這裏的屬性是非靜態成員),不管你創建多少各類對象,函數在內存只會有一份,而屬性會有好幾份。那麼我們調用函數時,就會有this指針來告訴機器我們想要的是那個類對象。而this指針指向的是類對象,就是說this存放的是類的地址。已知函數和屬性分開存儲,函數只佔一份,那我們可以猜測函數存儲不在類中,那類的地址就是第一個屬性的地址。

class Person
{
public:
	void show_this()
	{
		std::cout << int(this) << std::endl;
		std::cout << (&m_age) << std::endl;
		std::cout << (&age) << std::endl;
		std::cout << *(&age)<< std::endl;
		std::cout << *((&m_age)+1 ) << std::endl;
		std::cout << *((int*)(int(this)+4)) << std::endl;
		//c++中一旦出現轉爲int類型則不能*操作
	}
	int m_age;
	int age;
};
int main()
{
	Person p1;
	Person p2;
	p1.age = 20;
	p1.m_age = 10;
	p2.m_age = 15;
	p2.age = 30;
	p1.show_this();
	p2.show_this();
	return 0;
}

*c++中是不支持直接用cout打印類的,在實驗中我們知道this也是不支持打印的,可知this是一個類指針,而this是這個對象,比如說我們想輸出age,直接輸入(this).age即可,還有我們先用this指針操作第二個變量那我們應該怎麼做呢?我們用到的另一種方法就是通過地址,因爲類中創建的變量地址肯定是連續的,那麼我們可以知道第二個變量地址是第一個變量地址+4個字節,因爲第一個變量整型佔用4個字節,那麼我們先把地址轉爲int類型然後+4,這個時候就不是地址類型了,所以我們還要把轉化後的重新轉爲整形地址然後進行取地址操作就可以了。
在這裏插入圖片描述
結果成功得到我們想要的。在創建類中遇到問題就是,爲什麼創建兩個類是在內存存儲首地址之間相差12個字節,原理我以爲類創建是連續的,現在看來好像不是連續的,希望有人能給我解答。

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