Klassesnprobleme



  • Hi mal wieder ich möchte wissen , wozu *this in klassen gut ist..
    heisst das, dass wenn ich folgende funktion habe:

    a.operator=(int &b);
    

    dass return *this auf a zeigt oder worauf?? ich habs schonmal gefragt aber die erklärung nicht verstanden, war auch in nem andren forum... 😉

    und weshalb ist eigentlich inline gut, und wann setzt man es ein??? 😕



  • JossBoss schrieb:

    dass return *this auf a zeigt ...

    Richtig. this ist ein Zeiger auf die eigene Instanz.

    Mehr erklärt man dir sicherlich gern im C++-Forum :).



  • Dieser Thread wurde von Moderator/in AJ aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ein typischer Zuweisungsoperator (aus der MSDN (edit: brummel self-assignment vergessen)):

    A& A::operator=(const A& rhs) 
    {
      if( this == &rhs) return *this; // edit: handle self-assignment (a = a)
      CopyObj(rhs);
      return *this;
    }
    

    Wenn Du jetzt eine Instanz einer Klasse A hast:

    A a;
    A b;
    a.operator=(b);
    

    zeigt this bei der Ausführung der Zeile a.operator=(b) auf a und *this ist a.

    Der Zuweisungsoperator braucht für seine Arbeit, also Daten von einem anderen Objekt in das eigene Objekt eigentlich gar nichts zurückzugeben. Das eigene Objekt hat die Daten ja übernommen, warum also eine Rückgabe.
    In C/C++ ist folgende Zeile möglich:

    a = b = c;
    // das entspricht also:
    a.operator=(b.operator=(c));
    

    Wenn b.operator= nichts zurückgeben würde, wäre diese Syntax nicht mehr möglich.
    Also muss b.operator= sich selbst zurückgeben und das ist halt *this.

    Zu Deiner Frage nach inline:
    inline ist erstmal ein Hinweis an den Compiler, dass Du denkst, dass es sich lohnt Aufrufe dieser Routine nicht durch einen Sprung in die Routine sondern durch kopieren des Codes an die Ausführungsstelle zu erledigen.
    Beispiel:

    inline int max( int a, int b) {
       return a > b ? a : b;
    }
    

    wird also in der Nutzung zu:

    int someFunction()
    {
       int c = max( a, b); // durch das inline kann der Compiler den Sprung wegoptimieren, also
      // int c = a > b ? a : b;
    }
    

    Warum ist das gut? Der Sprung kostet Zeit (genauer der Stackframe, der erzeugt wird) und wenn die Routine kurz ist, kann das locker viele Prozente von der eigentlichen Routine ausmachen. Deswegen möchte man den Sprung vermeiden.
    Der Nachteil: Der Code wird länger, weil der Code für Deine Routine nicht einmal erzeugt wird, sondern für jeden Aufruf
    Das ganze ist aber nur ein Hinweis an den Compiler, d.h. er entscheidet selbstständig, ob er tatsächlich inlined. Lässt Du den Hinweis weg, wird meines Wissens bei den heutigen Compilern nicht geinlined.



  • Thx @niemand hast mir sehr mit den fragen geholfen, trotzdem hab ich leider noch eine frage:

    Wenn b.operator= nichts zurückgeben würde, wäre diese Syntax nicht mehr möglich.
    Also muss b.operator= sich selbst zurückgeben und das ist halt *this.

    diesen satz kapier ich irgendwie nich 😉 wieso wäre die syntax dann nich mehr gültig? und weshalb muss man dann this zurückgeben?

    dann noch eine frage, mussman durch mit inline erstellte methoden mit instanzen aufrufen? oder geht das wie in deinem beispielcode mit max ohne instanzen?
    oder was muss man dafür tun?
    thx 🙂



  • JossBoss schrieb:

    diesen satz kapier ich irgendwie nich 😉 wieso wäre die syntax dann nich mehr gültig? und weshalb muss man dann this zurückgeben?

    weil zb solche sachen nicht mehr funktioneren würden

    A a1;
    A a2;
    A a3;
    a1 = a2 = a3;
    

    JossBoss schrieb:

    dann noch eine frage, mussman durch mit inline erstellte methoden mit instanzen aufrufen? oder geht das wie in deinem beispielcode mit max ohne instanzen?
    oder was muss man dafür tun?
    thx 🙂

    dies ist keine methode sonderen eine funktion, somit existiert keine instanzierungsmöglichkeit



  • ja aber weshalb würde das nich merh laufen?? 😉



  • Und was kann man dafür tun damit man sie ohne instanz aufruifen kann ( nicht statisch) oder ist das nich möglic?? 😕



  • JossBoss schrieb:

    ja aber weshalb würde das nich merh laufen?? 😉

    es würde schon laufen (vorraussetzung du machst solch eine zuweisung nicht), wäre aber syntaktisch nicht richtig.

    siehe zb: http://www.cpp-tutor.de/cpp/le12/le12_03.htm



  • JossBoss schrieb:

    Und was kann man dafür tun damit man sie ohne instanz aufruifen kann ( nicht statisch) oder ist das nich möglic?? 😕

    FUNKTION schreiben.



  • niemand schrieb:

    edit: brummel self-assignment vergessen

    Wobei diesbzgl. von einer generellen Verwendung abzuraten ist. Nur in seltenen Fällen (zB shared Smart Pointer) ist sowas sinnvoll. Saubere Klassenimplementierungen können das ansonsten, genau wie builtin Typen, problemlos handeln. Und da 99.99% aller Fälle keine Selbstzuweisungen sind, spart man sich praktisch immer den unnötigen Vergleich.


Anmelden zum Antworten