一起來學習C++中類的this指針以使用
c++的類中,非靜態(tài)的成員函數(shù)都有一個隱藏的this指針
,在函數(shù)體中所以的成員變量都是通過this指針
來訪問的。但是this指針是對用戶是透明的,用戶不需要顯示的給this指針傳參,編譯時會自動接收參數(shù)。
一,this指針的注意點
- 調用成員函數(shù)時,不可以顯示給this指針傳參
- 定義成員函數(shù)時,不能顯示的聲明this指針
- 在成員函數(shù)內部,可以顯示的使用this指針
用一個日期類,來講述this指針的注意點:
class Date { public: void Print() { cout<<_year<<"/"<<_month<<"/"<<_day<<endl; } Date (int year,int month,int day) { _year=year; _month=month; _day=day; ] private: int _year; int _month; int _day; }
以上就是一個日期類了,在類里面我定義了一個成員函數(shù)Print
,這里要講一下,在類中定義一個成員函數(shù)可能會被看成內聯(lián)函數(shù)
,想這么簡單一個Print
函數(shù)一般是會別看成內聯(lián)函數(shù)的。
其實這個成員函數(shù)還可以寫成這樣:
void Print() { cout<<this->_year<<"/"<<this->_month<<"/"<<this->day<<endl; }
這樣寫有點畫蛇添足的感覺,但是方便大家看,在成員函數(shù)中每個成員變量的訪問都里離不開this指針
。這個this指針隱藏在函數(shù)形參的頭一位,也就是Print(Date * this)。
比如我要調用這個成員函數(shù):
int main() { Date s1(2022,2,28); Date s2(2022,3,1); s1.Print(); s2.Print(); }
運行結果如下:
可以看到,調用結果是符合預期的,Print函數(shù)中是利用this指針
來區(qū)分對象的。
錯誤用例:
(1)
int main() { Date s1(2022,2,28); s1.Print(&s1); }
不可以顯示的給this指針傳參,雖然我們知道this指針存在,但是我們不可以給this指針傳參,就當潛規(guī)則吧。
(2)
void Date::Print(Date* this);
成員函數(shù)的聲明以及定義都不能有this指針,這樣做不行的,可以想想設計者的初心,他是嫌棄老是傳地址麻煩,所以搞了一個隱藏的this指針,你再給函數(shù)傳參或者定義函數(shù)時給this指針,不是多此一舉嘛。
二,this指針存在哪里
this指針是成員函數(shù)第一個隱藏的指針形參
,一般存在棧中。但是也是由編譯器決定的
,有的就存在寄存器中。
三,this指針的面試坑題
class A { public: void PrintA() { cout<<_a<<endl; } void Show() { cout<<"Show()"<<endl; } private: int _a; }; int main() { A* p = nullptr; p->PrintA(); p->Show(); }
問:以上程序可以運行嘛?會崩潰嘛?崩潰在哪里?
這是對空指針解引用導致的內存問題,所以程序崩潰了,this指針可以為空,但是不能對空指針解引用,函數(shù)PrintA中,cout<<_a<
;可以寫成cout<< this -> _a<
; 講到這大家應該懂了。
還有一點那么Show函數(shù)有問題嘛?沒問題,因為不存在對this的解引用。
我們將PrintA函數(shù)屏蔽掉,看運行結果:
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
C++?Qt開發(fā)之運用QJSON模塊解析數(shù)據(jù)
JSON(JavaScript?Object?Notation)是一種輕量級的數(shù)據(jù)交換格式,它易于人閱讀和編寫,也易于機器解析和生成,本文主要介紹了Qt如何運用QJson組件的實現(xiàn)對JSON文本的靈活解析功能,需要的可以參考下2024-01-01在Visual Studio Code中配置C++編譯環(huán)境的問題
關于Visual Studio Code對C++環(huán)境的配置方法應該有好多種,我這里用到了其中的兩種,具體內容詳情文中給大家詳細介紹,對Visual Studio Code配置C++編譯環(huán)境相關知識感興趣的朋友一起看看吧2021-07-07C語言開發(fā)實現(xiàn)井字棋及電腦落子優(yōu)化示例詳解
以前上課經(jīng)常和同桌玩起井字棋,那么我們就當我們回憶童年,現(xiàn)在也用C語言來實現(xiàn)井字棋,本次代碼相對于初階的井字棋,在電腦下棋代碼部分做了優(yōu)化,使得電腦更加具有威脅2021-11-11