Was bringt es Funktionen zu überladen ?



  • Dein Beispiel do_stuff ist kacke, fürchte ich.

    int quadrat(int i);
    double quadrat(double d);
    float quadrat( float f);

    "quadrat" bedeute einfach immer das selbe irgendwie. Dann ist Überladen gut. Aber wenn man den selben Namen mit verschiedenen Bedeutungen überlädt, soll man sich besser einen Bolzenschussapparat nehmen. (In Javascript sind Pseudoüberladungen (Sprache hat zwar direkt keine Überladungen, aber man kann die Parameter zählen und deren Typen bestimmen) mit Bedeutungswechsel leider üblich, und stets ist es undokumentiert.)

    Das wäre ja, die zauberhaften Sprachmittel von C++ dazu zu verwenden, daß man den Code danach im Vergleich zu klassischem Code schlechter lesen kann. Das ist sicherlich nicht im Sinne des Erfinders.

    Überladung erleichtert das Pr0ggern, wenn mit dem selben Namen voll ähnliche Aktionen gemeint sind. Zum Beispiel "wegmachen, vernichten, Ressourcen ans Betriebssystem freigeben, löschen" ist so ein Ding, das man gerne generell einfach close nennt. Was genau geclosed wird, hängt vom Typ des Parameters ab. Und was genau passiert, natürlich genauso. Für mich ist es einfach close und gut ist's.



  • Danke für eure Antworten ich habs jetzt so ziemlich verstanden.

    überleg was das für dein Beispiel bedeuten würde, wenn du nun var2 plötzlich doch lieber als int hättest...

    dann müsst ich schreiben:
    var2 = do_stuff( 10 );
    oder
    var2 = do_stuff( 10, 11 );
    Dann wäre es wieder Int oder ?

    Danach kommt ein Beispiel in dem Funktionen mit Standartparametern überladen werden, es wird gesagt das wenn sich die einzelnen Parameter nicht grundlegend unterscheiden sollte man Standartparameter der Funktionsüberladung vorziehen, ich verstehe nicht warum im ersten Beispiel 3 Funktionen genutzt werden und in dem 2ten mit den Standartparametern nur eine die die möglichkeiten von 3 hat...
    ich will es ganz verstehen ..
    Kann ich nicht einfach eine Funktion machen in etwa so:

    int funktion( int par1, int par2, int par3)
    
    float var;
    var = funktion( 1.3 )
    

    ?
    Würd mich über eine detailreiche Antwort freuen!

    // FunctionsüberladungmitStandartParametern.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    double do_stuff( double par1, double par2 = 2.0 );
    void do_stuff( ... );
    
    int main()
    {
    	int var1;
    	double var2;
    	var1 = do_stuff( 10 );
    	cout << var1 << '\n';
    	var2 = do_stuff( 10.2 );
    	cout << var2  << '\n';
    	var1 = do_stuff( 10, 11 );
    	cout << var1 << '\n';
    	var2 = do_stuff( 10.1, 11.2 );
    	cout << var2 << '\n';
    	do_stuff ( 'a', 'b', 'c' );
    	cin.get();
    	return 1337;
    }
    
    double do_stuff( double par1, double par2 )
    {
    	return ( par1 * par2 );
    }
    
    void do_stuff( ... )
    {
    	cout << "Fehler bei der Eingabe!\n";
    }
    


  • volkard schrieb:

    Dein Beispiel do_stuff ist kacke, fürchte ich.



  • Miriiam schrieb:

    Danke für eure Antworten ich habs jetzt so ziemlich verstanden.

    überleg was das für dein Beispiel bedeuten würde, wenn du nun var2 plötzlich doch lieber als int hättest...

    dann müsst ich schreiben:
    var2 = do_stuff( 10 );
    oder
    var2 = do_stuff( 10, 11 );
    Dann wäre es wieder Int oder ?

    Nein, der Punkt ist, dass deine Funktionen ohne Overloading eben genau nicht alle do_stuff() heißen könnten, sondern verschiedene Namen haben müssten.
    Du müsstest sie dann also z.B. do_stuff_int_1_parameter() , do_stuff_int_2_parameters() , do_stuff_double_1_parameter() etc. nennen.
    Und welche davon aufgerufen wird, bestimmen ohne Overloading eben nichtmehr automatisch die Typen der Parameter. D.h. wenn du dein var2 nun von double auf int ändern willst, dann musst du auch sämtliche Funktionsaufrufe durchsuchen und auf die entsprechenden double Varianten umändern...und wehe du übersiehst dabei wo was...

    Hör was volkard sagt 😉



  • Bei kleineren Programmen ist das Überladen von Funktionen eher nur Übung, als wirklich sinnvoll zu sein.

    Aber bei Programmen mit mehreren tausend Zeilen Code dürfte das schon anders aussehen.

    Wenn man da ähnliche Funktionen anders benennen müßte, würde die Übersichtlichkeit wohl nicht wenig leiden.



  • Overloading ist eben ein gutes Werkzeug für viele Fälle. Und so einen Anwendungsfall hat man oder eben nicht, mit der Größe der Programme hat das absolut nichts zu tun.



  • dot schrieb:

    Overloading ist eben ein gutes Werkzeug für viele Fälle. Und so einen Anwendungsfall hat man oder eben nicht, mit der Größe der Programme hat das absolut nichts zu tun.

    Hat das Überladen von Funktionen noch einen anderen Vorteil ausser dem der besseren Lesbarkeit des Programms?


  • Mod

    Dürfen kleine Programme nicht übersichtlich sein?



  • Ja, hab ich ja oben schon beschrieben. Z.B. gestalten sich Programmänderungen einfacher.



  • redrew99 schrieb:

    dot schrieb:

    Overloading ist eben ein gutes Werkzeug für viele Fälle. Und so einen Anwendungsfall hat man oder eben nicht, mit der Größe der Programme hat das absolut nichts zu tun.

    Hat das Überladen von Funktionen noch einen anderen Vorteil ausser dem der besseren Lesbarkeit des Programms?

    Klar, wenn es um generische Programmierung geht.


Anmelden zum Antworten