2016-05-28 12 views
1

Wir wissen, dass ein „gemeinsamen“ Zeiger auf eine Funktion erstellen wir beispielsweise tun können:Adreßoperator mit Zeigern auf Elementfunktion

void fun(); 
void (*ptr)() = fun; 

Der Name einer Funktion ist auch die Adresse, wo die Funktion Start. Also brauche ich nicht den Adressoperator & wie folgt zu verwenden:

void (*ptr)() = &fun; 

nun für einen Zeiger auf eine Elementfunktion im Gegenteil ich den Adressoperator verwenden. Zum Beispiel für eine Klasse A mit einem Zeiger auf Elementfunktion ptr und Funktion fun() Ich muß schreiben:

void(A::*ptr)() = &A::fun; 

Warum dieser Unterschied?

+3

Der Verlauf der Verwendung von Funktionsnamen anstelle von Zeigern geht auf die frühen C-Zeiten zurück - ungefähr zur gleichen Zeit, als Sprachentwickler entschieden, dass Array-Namen den Zeiger auf ihr erstes Element darstellen. Diese Entscheidung widerspricht der Mehrzahl der anderen Anwendungsfälle für Zeiger, wenn "&" obligatorisch ist. C++ beseitigt dieses Problem für Dinge, die nicht in C. – dasblinkenlight

Antwort

0

Es ist, weil jetzt diese Funktion innerhalb der Klasse definiert ist. Pointer to member function enthält die "relative Adresse", in der sich die Funktion im Klassenlayout befindet und auf die Sie so zugreifen müssen.

Im Falle von statisch, hat es keine dieser Zeiger und es verhält sich wie eine globale Funktion und so können Sie wie normale Funktion Zeiger zugreifen.

+0

Bad English, aber im Wesentlichen richtig waren. –

+0

Ich habe versucht, es in sehr einfacher Sprache zu schreiben und deshalb kann man das sagen! Aber ich denke, ich verdiene eine Erwähnung, da die Antwort richtig ist: D –

+0

Ja, ich habe so etwas gelesen, aber ich habe es nicht ganz verstanden. Der Elementfunktionszeiger zeigt also nicht auf die Funktion, sondern zuerst auf die Klasse der Funktion und dann indirekt durch einen Offset auf die Funktion. Richtig? – andre3312

0

Ich denke, Unterschied ist, weil A::fun ist nicht-statische Mitglied der Klasse A. Ich meine, wenn Ihr fun() statisches Mitglied von A ist, wird es für gewöhnliche Funktion sein. Versuch es.

2

Nach dem C++ Standard:

4,3 Function-to-Zeigerumwandlungs [conv.func]

ein L-Wert von Funktionstyp T kann auf einen prvalue vom Typ umgewandelt wird „ Zeiger auf T ". Das Ergebnis ist ein Zeiger auf die Funktion.

Diese Konvertierung gilt nie für nicht statische Elementfunktionen, da ein Lvalue, der sich auf eine nicht statische Elementfunktion bezieht, nicht erhalten werden kann.