1.c++的類成員函式中,預設都隱含了乙個this指標,標識呼叫該成員函式的物件,每個成員函式的第乙個引數實際上都是有個預設 this 指標引數;
2.為什麼需要有乙個this指標呢?c++設計這個機制的初衷是什麼呢?
我們知道,普通的c++類,其成員函式是類的所有物件共享的,而資料是每個物件所獨有的.即:資料獨有,方法共享
因此在呼叫類的某個成員方法(非靜態方法)時,我怎麼知道是哪個物件呼叫的呢?此時就是通過this指標來區分的,通過this指標我可以區分是該類的哪個物件正在呼叫該成員方法.
注意事項:
a.this指標不屬於物件本身的一部分,不會影響sizeof作用於某個類物件的結果,因為sizeof本身也是求物件所對應的類的大小,與物件無關
b.this指標的作用域在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的位址作為乙個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加上this的,它作為非靜態成員函式的隱含形參,對各成員的訪問均通過this進行。
理解:要想理解 c++ 的 this 指標,我們可以先把下面的 c++ **轉換成 c **:
class
car}
;int
main()
m_price變數是car類的成員變數,那麼我們可以把car類和成員變數翻譯成如下的 c **:
// 結構體car
struct car
;
setprice函式是car類的成員函式,但是 c 程式裡是沒有成員函式這種概念的,所以只能把成員函式翻譯成全域性的函式:
// 引數1:結構體car的指標
// 引數2:要設定的**變數
void
setprice
(struct car*
this
,int p)
為什麼要加個 this 的指標呢?我們繼續往下看。
在這裡我們把上面main函式下面的 c++ 程式翻譯 c 程式是這樣的:
int
main()
所以最終把上述的 c++程式 轉換成c 程式的**如下:
struct car
;void
setprice
(struct car*
this
,int p)
intmain()
02 this指標的作用
其作用就是指向成員函式所作用的物件,
所以非靜態成員函式中可以直接使用 this 來代表指向該函式作用的物件的指標。
#include
class
carvoid
setprice
(int p)
car getcar()
};intmain
(void
)
輸出結果:20000 20000
接下來我們下面的**,你覺得輸出結果是什麼呢?會出錯嗎?
classa}
;int
main()
答案是正常輸出hello,你可能會好奇明明 p 指標是空的,不應該是會程式奔潰嗎?別著急,我們先把上面的**轉換c程式,就能理解為什麼能正常執行了。
void
hello()
# 成員函式相當於如下形式:
void
hello
(a *
this)
p->
hello()
; # 執行hello
()形式相當於:
hello
(p);
所以,實際上每個成員函式的第乙個引數預設都有個指向物件的 this 指標,上述情況下如果該指向的物件是空,相當於成員函式的第乙個引數是null,那麼只要成員函式沒有使用到成員變數,也是可以正常執行。
下面這份**執行時,就會奔潰了,因為this指標是空的,使用了 空的指標指向了成員變數i,程式就會奔潰。
class
a// ->> void hello(a * this ) };
intmain()
C語言指標的理解以及指標的指標的理解
指標指向的是記憶體位址編號,記憶體位址編號指向的是對應的內容。我們需要乙個變數,來儲存記憶體位址編號,這個變數的值是乙個記憶體位址編號,但是我們可以通過修改變數的值,來不斷的改變記憶體位址編號。但是,我們如果需要改變該記憶體位址編號的值時,就需要對該記憶體位址編號的值進行修改,而不改變記憶體位址編號...
指標的理解
指標陣列本質上是陣列,是乙個存放指標的陣列。eg int arr1 10 char arr2 10 char arr3 5 均為指標陣列,是陣列 int 型別 中元素是 int 型別 是陣列 char 型別 中元素是 char 型別 陣列中存放 二級指標 陣列指標本質上是指標,是乙個指向陣列的指標。...
this指標的理解
苦澀的茶 產品開發 先要理解class的意思。class應該理解為一種型別,象int,char一樣,是使用者自定義的型別。用這個型別可以來宣告乙個變數,比如int x,myclass my等等。這樣就像變數x具有int型別一樣,變數my具有myclass型別。理解了這個,就好解釋this了,my裡的...