C++關於this指針、靜態變量和靜態成員函數

1.this指針

this指針就是類的實例起始地址——實例的變量存儲區的起始地址,和代碼區是分開的。有了this指針我就可以訪問我的實例的變量,並傳遞給代碼區區執行。值得注意的是,this指針本身並不是實例的一部份,所以不會影響sizeof(實例)的大小。

當你進入一個房子後,
你可以看見桌子、椅子、地板等,
但是房子你是看不到全貌了。
對於一個類的實例來說,
你可以看到它的成員函數、成員變量,
但是實例本身呢?
this是一個指針,它時時刻刻指向你這個實例本身。

this是指向實例化對象本身時候的一個指針,裏面存儲的是對象本身的地址,通過該地址可以訪問內部的成員函數和成員變量。
      爲什麼需要this?因爲this作用域是在類的內部,自己聲明一個類的時候,還不知道實例化對象的名字,所以用this來使用對象變量的自身。在非靜態成員函數中,編譯器在編譯的時候加上this作爲隱含形參,通過this來訪問各個成員(即使你沒有寫上this指針)
return *this返回的是當前對象的克隆或者本身(若返回類型爲A, 則是克隆, 若返回類型爲A&, 則是本身 )。
return  this返回當前對象的地址(指向當前對象的指針)

this的使用:
(1)在類的非靜態成員函數中返回對象的本身時候,直接用return *this(常用於操作符重載和賦值、拷貝等函數)。
(2)傳入函數的形參與成員變量名相同時,例如:this->a = a

2.類的公共變量——靜態成員變量

靜態就是在程序編譯時就分配存儲空間,而不是等到運行時才知道,也就是程序加載之後,它的存儲空間就已經分配了。這是因爲我們有時候希望即便類的實例銷燬了,但我卻希望保存它的某些數據,那麼這個時候,靜態成員變量就是一個很好的選擇。對於被所有類共享的數據可聲明成靜態變量,它在程序運行前就已經存在了(所以一定要初始化),它被放到靜態存儲區,按照出現次序被初始化。 它被所有該類的對象共享,靜態變量可以被改變。

構造函數是爲了構造對象而定義的,而靜態變量是 一個類的變量,而不是類的實例的變量,所以自然不能在用於構造對象的構造函數中初始化靜態變量。

靜態變量調用的時候可以通過對象調用,也可以通過類直接調用。

3.不依賴於類實例的函數——靜態函數

靜態函數沒有this指針。  靜態函數只能訪問類中的靜態成員變量
靜態函數不需要類的實例就可以調用
靜態成員函數不屬於任何對象,而是屬於類的。

顯然調用靜態函數效率要高,因爲不需要找類實例的數據就可以執行(所以自然不需要標記類實例地址的this指針了),由於沒有隱含的this指針,自然無法訪問類的其他變量,而只能訪問靜態變量了。

一般: A a=new A; a.fun();      靜態函數:A::fun();

類的成員函數想作爲回調函數來使用,一般情況下只能將它定義爲靜態成員纔行。比方說,光靠類中”其他“函數,不能將類中的某個“其他”函數當作線程的入口地址。如果要作線程函數的入口地址,一定要聲明爲靜態的函數,靜態函數的地址是加載即確認,OS可以直接找到,建立新線程。而非靜態函數卻是動態加載,如果作爲回調函數和線程函數,就只能是靜態函數.
static成員函數不能爲virtual        virtual static void fun() { }//錯誤
原因:①static成員不屬於任何類對象或類實例,故即使給此函數加上virutal也是沒意義的。 ②靜態成員函數沒有this指針。 

static成員函數不能爲const函數   static void fun() const { } //編譯錯誤    const static void fun() {}  //可以的 
原因:當聲明一個非靜態成員函數爲const時,對this指針會有影響。對於一個Test類中的const修飾的成員函數,this指針相當於Test const , 而對於非const成員函數,this指針相當於Test . 而static成員函數沒有this指針,所以使用const來修飾static成員函數沒有意義。 volatile的道理也是如此。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章