指向函式的指標與指向類的非靜態函式指標有什麼不同?

時間 2021-05-13 08:20:00

1樓:BlueWanderer

假設類A有乙個成員x,然後我有乙個也叫x的成員指標指向A的乙個成員函式y,然後我有乙個A的例項a。

於是,如果使用成員指標不需要.*,而是直接用.的話...

我怎麼明確a.x是想呼叫成員函式y,而不是訪問原本的那個x?(當然的確有辦法,只是遠沒有.*好用)。

2樓:Aman

首先說 C 語言,假設有乙個函式:

void

fun(

inta

)那麼指向這個函式的指標有兩種取法:

void(*

fun_ptr

)(int)=

&fun

;void(*

fun_ptr

)(int)=

fun;(*

fun_ptr

)(10

);fun_ptr(10

);即解引用符(*)可以省略不寫。這些都是語法上的簡便寫法,所以也沒什麼可糾結的。

那麼為什麼在 C++ 裡,這個星號(*)不能省略呢?

class

Object

};int

main

()因為在 C++ 裡, .* 和 ->* 是完整的、被稱為 pointer-to-member 的操作符:

expression .* expressionexpression ->* expression至於實現上,成員函式和普通函式也沒什麼大的不同。成員函式多了乙個隱含的引數,以便編譯器把 this 指標傳進去。

所以在使用成員函式指標呼叫的時候,要使用 pointer-to-member 這個二元操作符,把物件位址和函式位址都給出來;而普通函式只需要乙個函式位址。

參考:Member and pointer operators

3樓:餘朔鈺

對於普通函式指標來講,編譯以後其函式位址是確定並明顯的,只需要宣告函式引數列表後直接呼叫該位址,將引數壓入列表即可正常呼叫。

對於類成員函式(非靜態)來說,其位址存放在成員例項的開頭的虛函式表中,並不明顯。所以我們呼叫時需要首先獲取成員例項首位址,然後根據編譯時就確定的偏移量獲取到這個成員函式指標,然後才能呼叫到這個成員函式。為什麼要這麼做呢?

因為虛函式特性會修改虛函式表中虛成員函式的位址,以實現重寫。

對於類靜態成員函式來講,則不需要這麼做。因為靜態成員函式中不涉及動態類例項中的變數,所以其可以使用編譯時已經確定的偏移量,直接根據已存在在記憶體中的類的位址進行偏移(可以看做普通函式)。

4樓:data

普通的函式指標呼叫時也可使用如下方式:(*p)(形參列表) 故其實是和非靜態函式指標是一樣的只不過後者多了物件的作用域限制

C 中如何定義指向函式指標的指標?

zr scat 瀉藥先定義乙個函式指標 typedef void pfn void 再定義指向函式指標的指標 void print void pfn func print pfn ptr func 在c 11下,可以這麼偷懶獲得型別 1 include 23using namespace std 4...

是否可以在成員類中定義 指向父類的指標 ?

張翼德 這要分class B的宣告 h 和實現 cpp 檔案兩個地方 如果你在class B的宣告 h 裡沒有用到任何class A 的成員,比如就像你問題裡寫的那樣,只是用到了class A的名字,那你只要在class B前面宣告 class A 讓compiler知道 A是個class 就行了,...

C 中,如果指標換了被指向的東西,那被指向的原來的東西(是被 new 出來的)所佔的記憶體會立刻被釋放嗎?

高博遠 malloc,new new 等,都是從heap memory申請記憶體。對應的需要在不使用的時候用free,delete,delete進行釋放記憶體。如果不釋放申請過的記憶體,則構成memory leaks.since c 11 ISO標準出現,使用裸指標是最蠢的選擇。unique ptr...