Referenzdekleration



  • Hallo zusammen,

    Wuerde gerne wissen was der Unterschied bei den folgenden beiden Beispielen ist:

    Leere Kopierkonstruktoren:

    Mensch(const Mensch&){}  
    Mensch(const Mensch*){}
    

    Ausgaben:

    << &var << '\n'
    << *var << '\n'
    

    Die Frage waere nun eben was bei den Kopierkonstruktoren der Unterschied ist, und was das bei den Ausgaben fuer einen Unterschied macht, denn ich meinte das bei den Ausgaben die Wirkung gleich ist, ob nun '&' oder '*' voransteht.

    Freundliche Gruesse
    Fabian



  • 1. Der zweite Konstruktor ist kein Kopierkonstruktor, da er einen anderen Typ als den der Klasse entgegennimmt, nämlich einen Zeiger. Ansonsten ist der Unterschied (generell), dass man bei einem Zeiger NULL übergeben kann, ihn ändern darf und ihn dereferenzieren muss.

    2. Das erste gibt die Adresse aus, an der var im Speicher steht, und das zweite gibt den Inhalt dessen aus, worauf var zeigt. Das zweite setzt voraus, dass var ein Zeiger ist, sonst gibt es einen Compilefehler. Gleich sind die Ausgaben auf keinen Fall, eher das genaue Gegenteil.



  • OK, danke vielmals fuer die schnelle Antwort. Was bewirkt aber eigentlech das '&' bei diesem Kopierkonstruktor:

    Mensch(const Mensch&){}
    

    Oder anderst gefragt, wieso kann man das '&' nicht weglassen? Sry fuer diese dummen Fragen, aber C++ ist neu ein bisschen Neuland fuer mich. 🙂



  • Ich gebe der Referenz mal noch einen Namen, damit man besser drüber sprechen kann:

    Mensch(const Mensch& quelle)
    

    Damit deklarierst Du eine Referenz quelle auf das Parameterobjekt. An diese Referenz wird beim Aufrufen der Parameter gebunden - also im Konstruktor ist "quelle" ein anderer Name für das übergebene Objekt.

    Mensch person1; // irgendein Mensch
    Mensch person2( person1 ); // Aufruf Copy-Konstruktor.
    
    Mensch::Mensch( Mensch const& quelle )
    {
        // Hier ist quelle bei o.a. Aufruf ein anderer Name für person1.
    }
    

    Wenn Du statt einer Referenz ein Objekt übergeben würdest (ohne &), wäre quelle eine Kopie von person1. Inhaltlich identisch, aber ansonsten unabhängig. Der Vorteil von Referenzen in diesem Fall ist einfach, dass nicht kopiert werden muss, weil ja aus quelle sowieso nur gelesen wird.

    Lässt Du const weg, sind die Auswirkungen sogar noch größer: Änderungen an quelle wirken sich bei einer Referenz auf das Objekt person1 aus, Änderungen an einer Kopie von quelle lassen person1 hingegen kalt.



  • LordJaxom schrieb:

    Wenn Du statt einer Referenz ein Objekt übergeben würdest (ohne &), wäre quelle eine Kopie von person1. Inhaltlich identisch, aber ansonsten unabhängig. Der Vorteil von Referenzen in diesem Fall ist einfach, dass nicht kopiert werden muss, weil ja aus quelle sowieso nur gelesen wird.

    Eine kleine Ergänzung: In allgemeinen Funktionen ist der Unterschied nur minimal (und wirkt sich primär so aus, daß du bei Kopie den Parameter für temp-Werte nutzen kannst und bei Referenz die Daten nicht kopiert werden müssen). Beim Copy-Ctor ist es jedoch gravierend - dort den Parameter als Kopie zu übergeben würde eine Endlos-Rekursion auslösen (und ist deshalb verboten).


Anmelden zum Antworten