this指標的理解

2021-10-04 01:10:35 字數 2298 閱讀 8008

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裡的...