Zweck des Überladens



  • Hallo zusammen,
    zwar verstehe ich wie ich eine Operator oder eine Funktion überladen, doch ist mir der Sinn nicht ganz klar. Wenn ich zwei Funktionen vom gleichen Namen haben will, bedeutet das doch, dass mir einfach kein anderer Name einfällt. Ich glaube nicht, dass das Überladen versucht dieses Problem zu lösen.

    Kann mir jemand vielleicht ein Beispiel sagen, bei dem das Überladen einer Funktion wirklich relevant ist?

    Vielen Dank
    lg, freakC++



  • http://www.cplusplus.com/reference/string/string/string/
    Schau dir doch mal alleine den Ctor von std::string an, und nun stell dir vor es würde nur die zweite Möglichkeit gegeben sein einen String zu erzeugen:

    string ( const string& str );
    

    Was hat das zur Folge? Der Programmierer ist eingeschränkt und wäre so immer gezwungen wenn er einen String erzeugen will, ihn mit einem Wert zu füllen also meinetwegen

    std::string string("");
    

    oder

    std::string string("leer");
    

    und das jedesmal obwohl ich vielleicht nur ein temporären string brauche. Ich hätte nicht immer die Lust auf "Klammer auf","Hochkommas","eventuell ein Wert","Hochkommas","Klammer zu". Es dient einfach dazu um dem Anwender/Programmierer mehr Flexibilität zu bieten.



  • Hallo

    Es liegt einfach am Komfort. Verstehe nicht, was man da nicht verstehen kann. Im späteren Code kann man sich besser orientieren, ist ja auch klar, anstatt ein paar verschiedene Funktionen aufzurufen, ruft man praktisch "die gleiche" auf.

    Mfg.
    way



  • way schrieb:

    anstatt ein paar verschiedene Funktionen aufzurufen, ruft man praktisch "die gleiche" auf.

    Oder versehentlich die falsche.



  • mal abgesehen davon dass Firefighters Beispiel immernoch zwei Überladungen des Konstruktors benutzt (Copy-Ctor und std::string::string(char const*) ), hat das Überladen von Funktionen noch einige andere wichtige Anwendungsbereiche:
    - Wenn zwei Funktionen semantisch ein und dasselbe bedeuten macht es Sinn, sie auch gleich zu nennen. Die Funktionen unterscheiden sich dann meistens nur durch den Typ des Parameters, teils aber auch durch die Zahl der Parameter. Ein Beispiel ist die Methode insert() diverser STL-Container, es gibt Überladungen für den value_type, Iteratoren und Iterator-Ranges. Es ist deutlich bequemer einfach zu schreiben vec.insert(5); vec.insert(my_Iter); vec.insert(start_Iter, end_Iter); statt für jede Möglichkeit einen anderen Namen zu nehmen (insert, insertFromIterator, insertFromIteratorRange usw.), zumal schon an den Argumenten zu sehen ist, welche Version benutzt wird.
    - Operatoren. Wenn man die nicht überladen könnte müsste man sich für seine Rational-Klasse überlegen ob man andere Rational-Objekte addieren kann oder ints. Beides ginge nicht.
    - Templates. Wenn ich irgendwo in einem Template mit templateparameter T eine Funktion foo(t) aufrufe, wo t vom Typ T ist, dann kann der Compiler raussuchen, welche Überladung von foo angemessen ist. Ohne Überladungen würden die meisten Templates ganz einfach nicht funktionieren.



  • Hallo

    Oder versehentlich die falsche.

    Nein, wie sollte das passieren?

    Mfg.
    way



  • C++fan 2009 schrieb:

    Oder versehentlich die falsche.

    Da überladene Funktionen zumindest prinzipiell das Gleiche machen sollten, ist das eher unwahrscheinlich.



  • @pumuckl:D Jo stimmt hast recht 😃 Mist:D



  • way schrieb:

    Oder versehentlich die falsche.

    Nein, wie sollte das passieren?

    Die char Funktion soll aufgerufen werden

    void f (int i)
    {
      puts ("int");
    }
    
    void f (char c)
    {
      puts ("char");
    }
    
    int main()
    {
      f(9);   
    }
    


  • Aber du übergibst einen Int, daher wird Int ausgegeben.



  • c++fan 2009 schrieb:

    way schrieb:

    Oder versehentlich die falsche.

    Nein, wie sollte das passieren?

    Die char Funktion soll aufgerufen werden

    void f (int i)
    {
      puts ("int");
    }
    
    void f (char c)
    {
      puts ("char");
    }
    
    int main()
    {
      f(9);   
    }
    

    dann sag ihm doch einfach, dass du mit deinem int eigentlich ein char meinst... oder richte nicht so sinnlose Überladungen ein, wenn du es dann auch falsch verwenden willst



  • Hallo zusammen,
    vielen Dank für die zahlreichen Antworten. Ich denke, dass ich es verstanden habe und wenn es trotzdem noch Schwierigkeiten damit geben wird, dann melde ich mich wieder!

    Vielen Dank
    lg, freakC++


Anmelden zum Antworten