欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解C++中隱含的this指針

 更新時(shí)間:2024年01月29日 10:07:48   作者:仍在探索未知中  
這篇文章主要帶大家詳細(xì)了解一下C++中隱含的this指針,文中通過代碼示例和圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

一、this指針的引出

我們先來(lái)定義一個(gè)日期類Date,下面這段代碼執(zhí)行的結(jié)果是什么呢?

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
		
	}
private:
	int _year; 
	int _month; 
	int _day; 
};
int main()
{
	Date d1, d2;
	
	d1.Init(2022, 5, 11);
	d2.Init(2022, 5, 12);

	d1.print();
	d2.print();
	return 0;
}

可以看到分別打印出了兩個(gè)日期,它是怎么知道改打印哪個(gè)的?

在這里插入圖片描述

我們來(lái)分析一下,先看一下匯編代碼,看一看

在這里插入圖片描述

  • 我們看到上面的代碼是調(diào)用的同一個(gè)函數(shù),那么編譯器是如何知道那兩個(gè)日期的?
  • 其實(shí)C++里有一個(gè)隱形this指針,在微軟的官方文檔也有說(shuō)明
  • 在使用函數(shù)的時(shí)候其實(shí)里面傳了一個(gè)地址,然后有一個(gè)隱的this指針來(lái)接收

原形是這樣:

在這里插入圖片描述

在這里插入圖片描述

  • 那為什么這里報(bào)錯(cuò)了呢?
  • 因?yàn)椴槐匾獙懀@個(gè)是隱含的~~,我們可以直接在類里面使用

二、this指針的特性

剛剛上面也給你看了原形,細(xì)心的烙鐵已經(jīng)發(fā)現(xiàn)了,這個(gè)this指針是有一個(gè)const修飾的,而且這個(gè)const是在*的右邊

在這里插入圖片描述

這里的const修飾

在這里插入圖片描述

  • 到這里就得出的this本身是不被修改的,但是做指向的值是可以被修改
  • 我們可以在類中打印一下this指針的地址,再打印一下d1和d2的地址,我們來(lái)看一下:

在這里插入圖片描述

  • 得到結(jié)果就是this指針指向一個(gè)指向當(dāng)前對(duì)象的指針
  • 我們還可以下面這樣,是不會(huì)報(bào)錯(cuò)的,但是不能向上面直接在形參就寫上

在這里插入圖片描述

特點(diǎn):

1、形參和實(shí)參的位置,我們不能顯示寫

2、函數(shù)內(nèi)部可以使用

最后總結(jié)一下:

  • this指針的類型:類型 *const,即成員函數(shù)中,不能給this指針賦值
  • 只能在“成員函數(shù)”的內(nèi)部使用this指針本質(zhì)上是“成員函數(shù)”的形參,當(dāng)對(duì)象調(diào)用成員函數(shù)時(shí),將對(duì)象地址作為實(shí)參傳遞給this形參。所以對(duì)象中不存儲(chǔ)this指針。
  • this指針是“成員函數(shù)”第一個(gè)隱含的指針形參,一般情況由編譯器通過ecx寄存器自動(dòng)傳遞,不需要用戶傳遞

【面試題】

this指針存在哪里?

a、堆 b、棧 c、靜態(tài)區(qū) d、常量區(qū) e、對(duì)象里面

  • 首先排除e,因?yàn)槲覀冎?,在算類里?strong>對(duì)象的時(shí)候是沒有算this指針的大小,所以排除e
  • C++的const變量不是在常量區(qū),可以看到這兩個(gè)地址是挨著的

在這里插入圖片描述

那么什么在常量區(qū)呢?是const修飾的值在常量區(qū),這個(gè)指針變量在棧區(qū),指向了這個(gè)常量區(qū)的字符串的首字符,所以d也就排除

在這里插入圖片描述

  • c就更不可能了,static和全局的才在靜態(tài)區(qū)
  • a也可以排除,因?yàn)閙alloc的才在堆,這里不是malloc,所以排除
  • 最后就是在棧上,因?yàn)?strong>是一個(gè)形參(有些編譯比如vs可能會(huì)用寄存器存儲(chǔ))。不同的編譯器放在不同的位置,可能是棧,也可能是寄存器,(VC++編譯器是放在ECX中,其它編譯器有可能不同,也就是成員函數(shù)的其它參數(shù)正常都是存放在棧中。而this指針參數(shù)則是存放在寄存器中。)
  • 打開匯編我們也可以看到這里的lea就是load effective address【加載有效地址】,是存在ecx的值加載到 [d1]

在這里插入圖片描述

this指針可以為空嗎?

下面我們來(lái)看兩道題來(lái)解決這個(gè)問題的答案~

第一道:下面程序編譯運(yùn)行結(jié)果是? A、編譯報(bào)錯(cuò) B、運(yùn)行崩潰 C、正常運(yùn)行

class A
{
public:
	void Print()
	{
		cout << "Print()" << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->Print();
	return 0;
}

已經(jīng)完美運(yùn)行了,因?yàn)槲疫@里沒有訪問類里的對(duì)象,所以可以正常運(yùn)行

在這里插入圖片描述

第二道:下面程序編譯運(yùn)行結(jié)果是? A、編譯報(bào)錯(cuò) B、運(yùn)行崩潰 C、正常運(yùn)行

class A
{
public:
	void PrintA()
	{
		cout << _a << endl;

	}
private:
	int _a;
};

int main()
{
	A* p = nullptr;
	p->PrintA();
	return 0;
}

這里引發(fā)了空指針,因?yàn)槲倚枰蛴∵@里的_a,就要找到那塊空間

在這里插入圖片描述

也就可以寫成這樣,this指針是空指針,解引用就會(huì)報(bào)錯(cuò)

在這里插入圖片描述

所以this指針是可以為空的,只要在成員函數(shù)內(nèi)部不訪問其內(nèi)容,程序可以正常執(zhí)行的。

以上就是一文詳解C++中隱含的this指針的詳細(xì)內(nèi)容,更多關(guān)于C++ this指針的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++連接mysql數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)的具體步驟

    C++連接mysql數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)的具體步驟

    在實(shí)際開發(fā)中我們經(jīng)常需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問,針對(duì)不同類型的數(shù)據(jù)庫(kù)(如MySQL、sqLite、Access、Excel等),如果采用不同的方法進(jìn)行連接,會(huì)把我們搞崩潰,下面這篇文章主要給大家介紹了關(guān)于C++連接mysql數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)的具體步驟,需要的朋友可以參考下
    2023-04-04
  • OpenCV實(shí)現(xiàn)智能視頻監(jiān)控

    OpenCV實(shí)現(xiàn)智能視頻監(jiān)控

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)智能視頻監(jiān)控,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 詳解C++基礎(chǔ)——類繼承中方法重載

    詳解C++基礎(chǔ)——類繼承中方法重載

    這篇文章主要介紹了C++基礎(chǔ)——類繼承中方法重載,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C++實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng)

    C++實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語(yǔ)言近萬(wàn)字為你講透樹與二叉樹

    C語(yǔ)言近萬(wàn)字為你講透樹與二叉樹

    樹是計(jì)算機(jī)算法最重要的非線性結(jié)構(gòu)。因?yàn)闃淠芎芎玫孛枋鼋Y(jié)構(gòu)的分支關(guān)系和層次特性,所以在計(jì)算機(jī)科學(xué)和計(jì)算機(jī)應(yīng)用領(lǐng)域有著廣泛的應(yīng)用。這篇文章我就帶大家一起了解一下樹、二叉樹這種結(jié)構(gòu),下篇文章會(huì)重點(diǎn)向大家介紹二叉樹的遍歷算法
    2022-05-05
  • 使用C語(yǔ)言判斷英文字符大小寫的方法

    使用C語(yǔ)言判斷英文字符大小寫的方法

    這篇文章主要介紹了使用C語(yǔ)言判斷英文字符大小寫的方法,分別為isupper()函數(shù)和islower()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C++中ctemplate的使用

    C++中ctemplate的使用

    CTemplate是一種簡(jiǎn)單但功能強(qiáng)大的模板引擎,廣泛用于各種HTML模板解析和生成,本文主要介紹了C++中ctemplate的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C++深入講解函數(shù)重載

    C++深入講解函數(shù)重載

    C++ 允許多個(gè)函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function Overloading),借助重載,一個(gè)函數(shù)名可以有多種用途
    2022-07-07
  • 解析C++的線性表鏈?zhǔn)酱鎯?chǔ)設(shè)計(jì)與相關(guān)的API實(shí)現(xiàn)

    解析C++的線性表鏈?zhǔn)酱鎯?chǔ)設(shè)計(jì)與相關(guān)的API實(shí)現(xiàn)

    這篇文章主要介紹了解析C++中的線性表鏈?zhǔn)酱鎯?chǔ)設(shè)計(jì)與相關(guān)的API實(shí)現(xiàn),文中的實(shí)例很好地體現(xiàn)了如何創(chuàng)建和遍歷鏈表等基本操作,需要的朋友可以參考下
    2016-03-03
  • c++如何控制輸出浮點(diǎn)數(shù)小數(shù)點(diǎn)后若干位

    c++如何控制輸出浮點(diǎn)數(shù)小數(shù)點(diǎn)后若干位

    這篇文章主要介紹了c++如何控制輸出浮點(diǎn)數(shù)小數(shù)點(diǎn)后若干位問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論