C++中關(guān)于this指針的入門(mén)介紹
簡(jiǎn)介
C++編譯器給每個(gè)“非靜態(tài)的成員函數(shù)“增加了一個(gè)隱藏的指針參
數(shù),讓該指針指向當(dāng)前對(duì)象(函數(shù)運(yùn)行時(shí)調(diào)用該函數(shù)的對(duì)象),在函數(shù)體中所有成員變量的操作,都是通過(guò)該指針去訪問(wèn)。只不過(guò)所有的操作對(duì)用戶是透明的,即用戶不需要來(lái)傳遞,編譯器自動(dòng)完成
特性
1. this指針的類型:類類型* const
2. 只能在“成員函數(shù)”的內(nèi)部使用
3. this指針本質(zhì)上其實(shí)是一個(gè)成員函數(shù)的形參,是對(duì)象調(diào)用成員函數(shù)時(shí),將對(duì)象地址作為實(shí)參傳遞給this
形參。所以對(duì)象中不存儲(chǔ)this指針。
4. this指針是成員函數(shù)第一個(gè)隱含的指針形參,一般情況由編譯器通過(guò)ecx寄存器自動(dòng)傳遞,不需要用戶傳遞
舉例
class Data { public: void Printf() { cout << _year <<" "<<" "<< _month <<" "<< _day << endl; } void Init(int year=2022,int month=5,int day=25) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; int main() { Data d1,d2; d1.Init(2022,1,1); d1.Printf(); d2.Init(2022,2,2); d2.Printf(); return 0; }
這是一個(gè)簡(jiǎn)單的日期類,那么這里有一個(gè)問(wèn)題,我們?cè)谑褂么蛴『瘮?shù)Printf和初始化函數(shù)Init的時(shí)候,d1和d2調(diào)用的是同一個(gè)函數(shù),那么編譯器是怎么知道我是應(yīng)該設(shè)置/打印d1還是d2呢?
這其實(shí)就使用了this指針
那么具體編譯器是怎么做的呢?
void Printf(const* this)//編譯器實(shí)際上處理的 { cout << this->_year << " " << this->_month << " " << this->_day << endl; } void Printf()//我們看到的 { cout << _year <<" "<<" "<< _month <<" "<< _day << endl; }
void Init(const* this,int year=2022,int month=5,int day=25)//編譯器處理的 { this->_year = year; this->_month = month; this->_day = day; } void Init(int year = 2022, int month = 5, int day = 25)//我們看到的 { _year = year; _month = month; _day = day; }
d1.Init(2022,1,1);//我們看到的 d1.Init(&d1,2022, 1, 1);//編譯器實(shí)際上處理的
實(shí)際上編輯器取了d1和d2函數(shù)的地址,然后傳遞給了const*this,這樣編譯器就能自動(dòng)打印和初始化相應(yīng)的結(jié)構(gòu)了。
注意
我們不能自己在傳參處加const*this和&,這是編譯器自己做的,我們不能搶了編譯器的活,即使做了,編譯也不會(huì)通過(guò),但是里面我們可以加
void Printf(const* this)//錯(cuò)誤 { cout << _year <<" "<<" "<< _month <<" "<< _day << endl; } void Printf()//可以運(yùn)行,但是編譯器默認(rèn)都會(huì)加this->,所以我們可以不用加,加了也沒(méi)事 { cout <<this-> _year <<" "<<" "<< this->_month <<" "<< this->_day << endl; }
到此這篇關(guān)于C++中關(guān)于this指針的入門(mén)介紹的文章就介紹到這了,更多相關(guān)C++ this指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中邏輯運(yùn)算符與條件運(yùn)算符的學(xué)習(xí)教程
這篇文章主要介紹了C語(yǔ)言中邏輯運(yùn)算符與條件運(yùn)算符的學(xué)習(xí)教程,條件運(yùn)算符問(wèn)號(hào)即三目運(yùn)算符使用起來(lái)十分方便,需要的朋友可以參考下2016-04-04C語(yǔ)言實(shí)現(xiàn)電子時(shí)鐘程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電子時(shí)鐘程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11C語(yǔ)言實(shí)現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10C語(yǔ)言超詳細(xì)講解隊(duì)列的實(shí)現(xiàn)及代碼
隊(duì)列(Queue)與棧一樣,是一種線性存儲(chǔ)結(jié)構(gòu),它具有如下特點(diǎn):隊(duì)列中的數(shù)據(jù)元素遵循“先進(jìn)先出”(First?In?First?Out)的原則,簡(jiǎn)稱FIFO結(jié)構(gòu)。在隊(duì)尾添加元素,在隊(duì)頭刪除元素2022-04-04C++保存txt文件實(shí)現(xiàn)方法代碼實(shí)例
這篇文章主要介紹了C++保存txt文件實(shí)現(xiàn)方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11C/C++實(shí)現(xiàn)快速排序算法的思路及原理解析
這篇文章主要介紹了C/C++實(shí)現(xiàn)快速排序算法的思路及原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01linux內(nèi)核select/poll,epoll實(shí)現(xiàn)與區(qū)別
這篇文章主要介紹了linux內(nèi)核select/poll,epoll實(shí)現(xiàn)與區(qū)別,需要的朋友可以參考下2016-11-11