一起來學習C++中類的this指針以使用
c++的類中,非靜態(tài)的成員函數(shù)都有一個隱藏的this指針,在函數(shù)體中所以的成員變量都是通過this指針來訪問的。但是this指針是對用戶是透明的,用戶不需要顯示的給this指針傳參,編譯時會自動接收參數(shù)。
一,this指針的注意點
- 調(diào)用成員函數(shù)時,不可以顯示給this指針傳參
- 定義成員函數(shù)時,不能顯示的聲明this指針
- 在成員函數(shù)內(nèi)部,可以顯示的使用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ù)可能會被看成內(nèi)聯(lián)函數(shù),想這么簡單一個Print 函數(shù)一般是會別看成內(nèi)聯(lián)函數(shù)的。
其實這個成員函數(shù)還可以寫成這樣:
void Print()
{
cout<<this->_year<<"/"<<this->_month<<"/"<<this->day<<endl;
}
這樣寫有點畫蛇添足的感覺,但是方便大家看,在成員函數(shù)中每個成員變量的訪問都里離不開this指針。這個this指針隱藏在函數(shù)形參的頭一位,也就是Print(Date * this)。
比如我要調(diào)用這個成員函數(shù):
int main()
{
Date s1(2022,2,28);
Date s2(2022,3,1);
s1.Print();
s2.Print();
}
運行結(jié)果如下:

可以看到,調(diào)用結(jié)果是符合預期的,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指針,這樣做不行的,可以想想設(shè)計者的初心,他是嫌棄老是傳地址麻煩,所以搞了一個隱藏的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();
}
問:以上程序可以運行嘛?會崩潰嘛?崩潰在哪里?

這是對空指針解引用導致的內(nèi)存問題,所以程序崩潰了,this指針可以為空,但是不能對空指針解引用,函數(shù)PrintA中,cout<<_a<;可以寫成cout<< this -> _a<; 講到這大家應(yīng)該懂了。
還有一點那么Show函數(shù)有問題嘛?沒問題,因為不存在對this的解引用。
我們將PrintA函數(shù)屏蔽掉,看運行結(jié)果:

總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++ 虛函數(shù)與純虛函數(shù)的使用與區(qū)別
本文主要介紹了C++ 虛函數(shù)與純虛函數(shù)的使用與區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
C++的static關(guān)鍵字及變量存儲位置總結(jié)
今天看博文時,看到了c++的static關(guān)鍵字的一些總結(jié),還涉及到了一些代碼的存儲位置;接下來為您詳細呈現(xiàn)2012-11-11
Linux環(huán)境下段錯誤的產(chǎn)生原因及調(diào)試方法小結(jié)
借此機會系統(tǒng)學習了一下,這里對Linux環(huán)境下的段錯誤做個小結(jié),方便以后同類問題的排查與解決2011-11-11

