国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[ C++ ] 一篇帶你了解C++中隱藏的this指針

這篇具有很好參考價值的文章主要介紹了[ C++ ] 一篇帶你了解C++中隱藏的this指針。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本篇文章我們將一起討論在有趣的知識點--隱藏的this指針。本篇我們要使用到之前我們所學(xué)習(xí)到的C++類與對象(1),如果有各位小伙伴還不曾了解類與對象的簡單思想,可以訪問上篇博客:[ C++ ] 帶你一篇了解什么是OOP(面向?qū)ο缶幊?,什么是封裝? -- 類與對象(上)

目錄

1.this指針的引出

2.this指針的特性

3.練習(xí)一下

在之后的學(xué)習(xí)中,我們將認(rèn)識一個新的類:日期類Date。正如我們所想的那樣,傳入一個日期,我們可以輸出我們所輸入的日期。

1.this指針的引出

那我們首先來看一下,這段代碼會輸出什么結(jié)果呢?

class Date
{
public:
	void Display()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	void SetDate(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year; // 年
	int _month; // 月
	int _day; // 日
};
int main()
{
	Date d1, d2;
	d1.SetDate(2022, 5, 11);
	d2.SetDate(2022, 5, 12);
	d1.Display();
	d2.Display();
	return 0;
}

輸出結(jié)果:?

[ C++ ] 一篇帶你了解C++中隱藏的this指針

我們首先可以通過匯編來看看,d1,d2調(diào)用的函數(shù)是否相同。

[ C++ ] 一篇帶你了解C++中隱藏的this指針

我們可以發(fā)現(xiàn),最終打印的時候調(diào)用的Display()是同一個函數(shù),?那么既然d1,d2調(diào)用的都是同一個函數(shù),編譯器如何知道d1是2022-5-11,d2是2022-5-12呢?Display()都訪問的_year,_month,_day。而且去公共代碼區(qū)訪問的Display(),這是為什么呢?

這是因為C++在這段代碼中做出手腳,C++在這里增加了一個this指針,這里是因為Display會增加一個this形參。C++編譯器給每個“非靜態(tài)的成員函數(shù)“增加了一個隱藏的指針參數(shù),讓該指針指向當(dāng)前對象(函數(shù)運行時調(diào)用該函數(shù)的對象),在函數(shù)體中所有成員變量的操作,都是通過該指針去訪問。只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編譯器自動完成。

在調(diào)用的時候也傳的是各自的地址。這樣就十分清晰明了了。這就是隱含的this指針

[ C++ ] 一篇帶你了解C++中隱藏的this指針

[ C++ ] 一篇帶你了解C++中隱藏的this指針

[ C++ ] 一篇帶你了解C++中隱藏的this指針

?[ C++ ] 一篇帶你了解C++中隱藏的this指針

注意:我們不能顯示的寫出來,因為他是隱含的,我們不能搶了編譯器的活。但是我們可以直接在類里面用。

2.this指針的特性

在真正的編譯器中this指針的用const修飾的,this指針本身是不能被修改的,但是內(nèi)容是可以修改的。并且我們是可以使用的

[ C++ ] 一篇帶你了解C++中隱藏的this指針

我們可以在類中打印一下this指針,并且我們在也同時打印一下d1和d2的地址,我們來看一下:

class Date
{
public:
	void Display()
	{
        //使用this指針
		cout << this << endl;
		cout << _year << "-" << _month << "-" << _day << endl;
	}	

	void SetDate(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year; // 年
	int _month; // 月
	int _day; // 日
};
int main()
{
	Date d1, d2;
	cout <<"d1:"<< & d1 << endl;
	cout <<"d2:"<< & d2 << endl;

	d1.SetDate(2022, 5, 11);
	d2.SetDate(2022, 5, 12);

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

運行結(jié)果:?

[ C++ ] 一篇帶你了解C++中隱藏的this指針

?并且我們還能這樣寫,但是我們不能顯示的寫出Date* this。

[ C++ ] 一篇帶你了解C++中隱藏的this指針

?文章來源地址http://www.zghlxwxcb.cn/news/detail-471445.html

我們接下來再看看this指針是不能修改的,大家看下面這個能過嗎?答案肯定是不能的,因為this是被const修飾的,不能修改this指針的。

[ C++ ] 一篇帶你了解C++中隱藏的this指針

我們會發(fā)現(xiàn) 編譯器也會報錯:error C2106: “=”: 左操作數(shù)必須為左值

[ C++ ] 一篇帶你了解C++中隱藏的this指針

?this指針的特性總結(jié):

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

?

3.練習(xí)一下

(1)下面的程序的運行結(jié)果是? A.編譯報錯 B.運行崩潰 C.正常運行

class A
{
public:
	void Show()
	{
		cout << "show()" << endl;
	}
private:
	int _a;
};

int main()
{
	A* p = nullptr;
	p->Show();

	return 0;
}

結(jié)果:C

原因:Show()函數(shù)是存在公共代碼區(qū)中,編譯的時候在公共代碼區(qū)中找到這個函數(shù),和普通的函數(shù)調(diào)用是一樣的,只需要call函數(shù)地址就行。我們發(fā)現(xiàn)這里p是空指針,傳過去的this指針只是接收了p的空指針,就類似于this指針被初始化為空指針。這是允許的。[ C++ ] 一篇帶你了解C++中隱藏的this指針

?[ C++ ] 一篇帶你了解C++中隱藏的this指針

(2)下面的程序的運行結(jié)果是? A.編譯報錯 B.運行崩潰 C.正常運行

class B
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	int _a;
};
int main()
{

	B* p2 = nullptr;
	p2->PrintA();

	return 0;
}

結(jié)果:B

原因:此程序崩潰是在PrintA()中,會隱含一個this->_a,而this指針是一個空指針,訪問this指針_a的位置,就要對空指針進(jìn)行解引用,此時就會崩潰。我們也可通過調(diào)試觀察到。

[ C++ ] 一篇帶你了解C++中隱藏的this指針

[ C++ ] 一篇帶你了解C++中隱藏的this指針

?(3)this指針是存在哪里的?

a.棧? b.堆? c.靜態(tài)區(qū)? d.常量區(qū)

答案:a

解釋:this指針是個形參,形參是在函數(shù)的棧楨里,在函數(shù)的棧楨里面的變量是屬于棧中的。

有時編譯器會使用寄存器對其進(jìn)行優(yōu)化,this指針會存在寄存器中。

[ C++ ] 一篇帶你了解C++中隱藏的this指針

?[ C++ ] 一篇帶你了解C++中隱藏的this指針

?

(本篇完)

?

到了這里,關(guān)于[ C++ ] 一篇帶你了解C++中隱藏的this指針的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • [Linux 基礎(chǔ)] 一篇帶你了解linux權(quán)限問題

    [Linux 基礎(chǔ)] 一篇帶你了解linux權(quán)限問題

    Linux下有兩種用戶:超級用戶(root)、普通用戶。 超級用戶:可以再linux系統(tǒng)下做任何事情,不受限制 普通用戶:在linux下做有限的事情。 超級用戶的命令提示符是“#”,普通用戶的命令提示符是“ $ ” 命令: su [用戶名] 功能: 切換用戶。 例如,要從root用戶切換到普通用

    2024年02月08日
    瀏覽(21)
  • 【Mysql】一篇帶你了解數(shù)據(jù)定義,操作和查詢語言

    【Mysql】一篇帶你了解數(shù)據(jù)定義,操作和查詢語言

    目錄 數(shù)據(jù)定義語言DDL(Data Definition Language) 一.對數(shù)據(jù)庫的操作 二.對數(shù)據(jù)表的操作 數(shù)據(jù)操作語言DML(Data Manipulation Language) 一.添加 insert into 二.刪除? delete 三.修改? update 數(shù)據(jù)查詢語言DQL(Data Query Language) 一.查詢 select 二. 1.between ... and ...(在....之間) 2.in, exists

    2024年02月12日
    瀏覽(22)
  • [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細(xì)了解希爾排序

    [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細(xì)了解希爾排序

    目錄 1、常見排序算法 1.1 插入排序基本思想 2、希爾排序 2.1 希爾排序( 縮小增量排序 ) 2.1.1 預(yù)排序階段 2.1.2 插入排序階段 2.2 單趟希爾排序 2.2.1 思路分析 2.2.2 代碼實現(xiàn) 3、希爾排序代碼實現(xiàn) 4、希爾排序時間復(fù)雜度 5、希爾排序與插入排序效率對比 6、希爾排序特性總結(jié) 直接

    2024年02月13日
    瀏覽(28)
  • 【C語言】-- 一篇帶你了解C語言內(nèi)存五大區(qū)——棧區(qū),堆區(qū),全局區(qū),常量區(qū),代碼區(qū)

    【C語言】-- 一篇帶你了解C語言內(nèi)存五大區(qū)——棧區(qū),堆區(qū),全局區(qū),常量區(qū),代碼區(qū)

    目錄 1 C語言的內(nèi)存分區(qū) 1.1 內(nèi)存五大分區(qū) 1.2 內(nèi)存分區(qū)簡介 1.2.1 棧區(qū)(stack) 1.2.2 堆區(qū)(heap) 1.2.3 (全局)靜態(tài)區(qū) 1.2.4 常量區(qū) 1.2.5 代碼區(qū) 創(chuàng)作不易,如果本篇博客對您有一定的幫助,大家記得留言+點贊哦。 C語言已經(jīng)持續(xù)學(xué)習(xí)一段時間了,今天特此總結(jié)一下關(guān)于C語言內(nèi)存的五大區(qū)

    2024年02月16日
    瀏覽(21)
  • 數(shù)組(一篇帶你掌握數(shù)組)

    數(shù)組(一篇帶你掌握數(shù)組)

    ? ? 在之前,我們想要存儲一個數(shù)據(jù)的時候可以創(chuàng)建變量,例如存儲一個整形的變量,我們使用int類型的變量來存儲,那么如果存儲一組相同類型的數(shù)據(jù)呢?這時我們就引入了 數(shù)組 的概念。 目錄 一、一維數(shù)組的創(chuàng)建和初始化 1.1數(shù)組的創(chuàng)建 1.2 數(shù)組的初始化 1.3 一維數(shù)組的使

    2023年04月08日
    瀏覽(20)
  • 一篇帶你精通MPLS

    一篇帶你精通MPLS

    MPLS:多協(xié)議標(biāo)簽交換 可以基于多種不同的3層協(xié)議來生成2.5層的標(biāo)簽信息 包為網(wǎng)絡(luò)層的PDU,故包交換就是基于IP地址進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā);也就是路由器的路由行為。(路由器和終端基于3層的IP地址數(shù)據(jù)轉(zhuǎn)發(fā)的路由行為) 原始包交換 查兩張表 在包交換過程中,數(shù)據(jù)包每經(jīng)過一個路

    2024年02月22日
    瀏覽(28)
  • Javaの一篇帶你吃透接口

    Javaの一篇帶你吃透接口

    隨著接口的到來,JavaSE的學(xué)習(xí)筆記大結(jié)局也即將來臨,最近的幾篇博客寫到了封裝,繼承,多態(tài),抽象類等等,都循序漸進(jìn)得介紹了這類的知識,大家如果接口這一塊理解的很困難的話,建議去完善一下前面的知識哦 ??Java封裝 ??靜態(tài)成員 ??代碼塊 ??內(nèi)部類 ??繼承 ??多

    2023年04月08日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】一篇帶你徹底吃透 順序表

    順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲。在數(shù)組上完成數(shù)據(jù)的增刪查改等功能。 順序表一般可以分為: 靜態(tài)順序表:使用定長數(shù)組存儲元素。 動態(tài)順序表:使用動態(tài)開辟的數(shù)組存儲。 而現(xiàn)實的順序表大多數(shù)采用動態(tài)

    2023年04月19日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包