impliziter und expliziter Funktionsaufruf
-
Hey ihr,
habe gerade eine Übung aus meinem C++ Primer gemacht.
Ein Programm sollte einfach 2 Zahlen addieren.
Allerdings sollte eine Funktion dafür geschrieben werden.
Diese durfe jedoch nicht direkt aufgerufen werden, sondern nur ein Zeiger auf diese Funktion.
Mein Quelltext:/* Das folgende Programm addiert zwei Zahlen Hierbei verwendet es jedoch einen Zeiger auf die Funktion, welche die Addition durchführt. */ #include <iostream> //Einbinden der Standard Eingabe/Ausgabe Bibliothek using namespace std; //Nach Befehlen im Namensbereich 'std' suchen. int addiere(int,int); //Funktionsdeclaration der Funktion, welche addieren soll. int main(void) //Start: MainFunktion { typedef int (*hallo)(int,int); //Zeiger auf Funktionen werden unübersichtlich wenn sie normal erstellt werden. Daher //ist hier eine Typendefinition auf den Zeiger auf die Funktion, welche zwei Integrale //Werte übernimmt und einen zurückliefert. hallo funktion = addiere; //'funktion' ist ein Zeiger, welcher auf eine Funktion zeigt, welche folgendermaßen aufgebaut ist //int name(int,int); cout << (*funktion)(3,4) << endl; //addiere wird über 'funktion'-Funktionszeiger aufgerufen getchar(); //Warten auf Eingabe vom User. Konsole soll nicht sofort geschlossen werden. } //Funktion 'addiere' Addiert nur zwei Zahlen. int addiere(int a, int b) { return(a+b); //Gibt die Summe aus 'a' und 'b' zurück. (Hier "7") }
Meine Frage ist allerdings zur folgenden Zeile:
cout << (*funktion)(3,4) << endl;
Hier wird die Funktion wies im Buch steht explizit aufgerufen.
Folgender Quelltext macht das selbe - nur eben ohne das *.cout << funktion(3,4) << endl;
Dieser Funktionsaufruf wird als implizit bezeichnet.
Was bedeuten diese beiden Begriffe hier genau und was ist überhaupt genau der Unterschied?
cya
David
-
die dereferenzierung erfolgt bei funktionszeigern implizit (ohne es extra hinschreiben zu müssen) oder explizit. normalerweise müssen zeiger explizit (man muss den dereferenzierungsoperator * benutzen, um an den wert zu kommen, auf den der zeiger zeigt) dereferenziert werden.
-
Das bedeutet, dass implizit ganz genau genommen eigentlich falsch ist, jedoch vom Compier trotzdem genommen wird, weils leichter ist?
-
es ist nicht falsch. es ist eine art syntaktischer Zucker, (ein zusätzlicher automatismus des parsers, um schöneren code zu erlauben) ähnlich dem impliziten dereferenzieren mittels des indexoperators []
int *werte = new int[5]; int x = werte[3]; //das gleiche wie vorher, aber explizit dereferenziert: int y = *(werte+3); //ist nicht so schön zu lesen
-
Jap.
So hatte ichs auch verstanden.
Besten Dank