c++(16)this指针详解
在c++類的靜態(tài)成員變量和靜態(tài)成員函數(shù)中,多次涉及到了this指針。下面注重介紹一下
前面講static成員變量占用的時(shí)候提到,如果sizeof類的大小,是不會計(jì)算static成員變量的,同樣的也不會計(jì)算成員函數(shù),
換句話說,其實(shí)成員函數(shù)是在類外的。那么當(dāng)我們創(chuàng)建完對象,使用對象的成員函數(shù),它是怎么知道我們訪問的是哪個(gè)對象的成員變量的?
我們知道編譯器在編譯一個(gè)普通成員函數(shù)時(shí),會隱式地增加一個(gè)形參 this,并把當(dāng)前對象的地址賦值給 this,所以普通成員函數(shù)能在創(chuàng)建對象后通過對象來調(diào)用并訪問該對象的成員變量。
?在創(chuàng)建對象之后,調(diào)用對象的成員函數(shù)時(shí),編譯器會將我們左邊的代碼翻譯成右邊的樣子。
關(guān)于this指針,有以下幾點(diǎn)總結(jié):
1)this指針指向當(dāng)前對象,可以訪問當(dāng)前對象的所有成員變量。包括private、protected、public。
2)this指針是const指針,一切企圖修改該指針的操作,如賦值(改變指向)、增減都是不允許的!
3)this指針只有在成員函數(shù)中才有定義。因此,在創(chuàng)建一個(gè)對象后,也不能通過對象使用this指針。所以,我們也無法知道一個(gè)對象的this指針的位置(只有在成員函數(shù)里才有this指針的位置)。當(dāng)然,在成員函數(shù)里,你是可以知道this指針的位置的(可以&this獲得),也可以直接使用的。
4)只有創(chuàng)建對象后,this指針才有意義。
5)static靜態(tài)成員函數(shù)不能使用this指針。原因靜態(tài)成員函數(shù)屬于類,而不屬于某個(gè)對象,所以static靜態(tài)成員函數(shù)壓根就沒有this指針。
6)this在成員函數(shù)的開始執(zhí)行前構(gòu)造的,在成員函數(shù)的執(zhí)行結(jié)束后清除。至于如何清除的,由編譯器實(shí)現(xiàn),程序員不關(guān)心。this是通過函數(shù)參數(shù)的首參數(shù)來傳遞的。
拓展1:如果在堆上創(chuàng)建對線,student *pstu = new student;這里的this的值和pstu的值是相同的。
#include <iostream> #include <cstring> using namespace std;class AA { public:AA(int a){m_a = a;}~AA(){}void PinrtThis(){printf("this = 0x%x\n", this);}private:int m_a; };int main(void) { AA *pa = new AA(10);pa->PinrtThis();printf("pa = 0x%x\n", pa);return 0; }拓展2:如何返回對象本身
#include <iostream> #include <cstring> using namespace std;class AA { public:AA(int a){m_a = a;}AA& returnAA(){return *this;}void Pinrt(){printf("m_a = %d\n", m_a);}private:int m_a; };int main(void) { AA a(10);AA b = a.returnAA();b.Pinrt();return 0; }this是一個(gè)指針指向?qū)ο?#xff0c;如果要在類的成員函數(shù)中返回對象本身,需要對this取值,也就是*this?
總結(jié)
以上是生活随笔為你收集整理的c++(16)this指针详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse中导入项目后页面报错org
- 下一篇: java动态时钟_Java实现的动态数字