c++(16)this指针详解
在c++類的靜態成員變量和靜態成員函數中,多次涉及到了this指針。下面注重介紹一下
前面講static成員變量占用的時候提到,如果sizeof類的大小,是不會計算static成員變量的,同樣的也不會計算成員函數,
換句話說,其實成員函數是在類外的。那么當我們創建完對象,使用對象的成員函數,它是怎么知道我們訪問的是哪個對象的成員變量的?
我們知道編譯器在編譯一個普通成員函數時,會隱式地增加一個形參 this,并把當前對象的地址賦值給 this,所以普通成員函數能在創建對象后通過對象來調用并訪問該對象的成員變量。
?在創建對象之后,調用對象的成員函數時,編譯器會將我們左邊的代碼翻譯成右邊的樣子。
關于this指針,有以下幾點總結:
1)this指針指向當前對象,可以訪問當前對象的所有成員變量。包括private、protected、public。
2)this指針是const指針,一切企圖修改該指針的操作,如賦值(改變指向)、增減都是不允許的!
3)this指針只有在成員函數中才有定義。因此,在創建一個對象后,也不能通過對象使用this指針。所以,我們也無法知道一個對象的this指針的位置(只有在成員函數里才有this指針的位置)。當然,在成員函數里,你是可以知道this指針的位置的(可以&this獲得),也可以直接使用的。
4)只有創建對象后,this指針才有意義。
5)static靜態成員函數不能使用this指針。原因靜態成員函數屬于類,而不屬于某個對象,所以static靜態成員函數壓根就沒有this指針。
6)this在成員函數的開始執行前構造的,在成員函數的執行結束后清除。至于如何清除的,由編譯器實現,程序員不關心。this是通過函數參數的首參數來傳遞的。
拓展1:如果在堆上創建對線,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是一個指針指向對象,如果要在類的成員函數中返回對象本身,需要對this取值,也就是*this?
總結
以上是生活随笔為你收集整理的c++(16)this指针详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse中导入项目后页面报错org
- 下一篇: java动态时钟_Java实现的动态数字