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 😉


Log in to reply