地址運算我們知道,建立一個「共同」指針例如,我們可以做一個函數:與成員函數指針
void fun();
void (*ptr)() = fun;
函數的名稱也是所在的地址的功能開始。所以,我並不需要使用地址操作&這樣的:
void (*ptr)() = &fun;
現在對於一個指向相反我必須使用地址運算符的成員函數。例如,對於A類與成員函數指針PTR和函數fun()我必須寫:
void(A::*ptr)() = &A::fun;
爲什麼這種差異?
地址運算我們知道,建立一個「共同」指針例如,我們可以做一個函數:與成員函數指針
void fun();
void (*ptr)() = fun;
函數的名稱也是所在的地址的功能開始。所以,我並不需要使用地址操作&這樣的:
void (*ptr)() = &fun;
現在對於一個指向相反我必須使用地址運算符的成員函數。例如,對於A類與成員函數指針PTR和函數fun()我必須寫:
void(A::*ptr)() = &A::fun;
爲什麼這種差異?
這是因爲現在該函數是在類中定義的。指向成員函數的指針保存函數在類佈局中的「相對地址」,因此您必須以此方式訪問它。
在靜態的情況下,它沒有這個指針,它的行爲像一個全局函數,因此,你可以像普通函數指針那樣訪問它。
英語不好,但基本上是正確的。 –
我試圖用非常簡單的語言編寫它,這就是爲什麼你可以這麼說!但我認爲我應該得到滿意答案,因爲答案是正確的:D –
是的,我讀了類似的東西,但我還沒有完全理解。所以成員函數指針並不指向函數,而是先指向函數的類,然後間接地通過偏移量指向函數..對嗎? – andre3312
我認爲區別是因爲A::fun
是類別A
的非靜態成員。我的意思是,如果您的fun()
是A
的靜態成員,它將像普通功能一樣。嘗試一下。
根據C++標準:
4.3功能到指針轉換 [conv.func]
功能類型
T
的左值可以轉換爲 類型的prvalue「指向T
「。結果是一個指向函數的指針。此轉換不適用於非靜態成員函數,因爲 指向非靜態成員函數的左值不能得到 。
允許使用函數名代替指針的歷史可以追溯到C語言的早期 - 大致與語言設計者決定讓數組名稱表示指向其第一個元素的指針大致相同。這個決定與其他大多數指針用例不一致,當'&'是必須的。對於C中沒有的東西,C++消除了這個問題。 – dasblinkenlight