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