Copykonstruktor und Zuweisungsoperator



  • Da wird nicht notwendigerweise der Kopierkonstruktor ausgeführt. Bei

    std::string foo = "bar";
    

    wird nicht erst eine Instanz von std::string erzeugt, die dann in foo kopiert werden könnte. Es handelt sich um eine alternative Schreibweise für nicht-explizite Konstruktoren mit genau einem Parameter.



  • KasF schrieb:

    EOutOfResources schrieb:

    ...Deklarieren...

    Definieren 😉

    Genau genommen ist es eine Definition mit Initialisierung( Kopierinitialisierung ) 😉

    Lg freeG



  • seldon schrieb:

    Da wird nicht notwendigerweise der Kopierkonstruktor ausgeführt.

    Jup, der Copy-Constructor wird hierbei wohl nie aufgerufen, da der C++ Standard erlaubt, aus dieser copy-initialization eine direct-initialization zu machen... das ja auch mehr Sinn macht, als ein tmp. Objekt zu erzeugen, dieses zu kopieren und es dann wieder zu zerstören.

    In diesem Zusammenhang ist dann gerade auch noch wichtig zu erwähnen, dass

    X x(...); /*und*/ X x = ...;
    

    nicht äquivalent sind, obwohl bei beiden Varianten nur der Konstruktoren mit genau 1 Parameter aufgerufen wird.

    class MyString
    {
        private:
            const char* s;
            MyString(const MyString&);
    
        public:
            MyString(const char* s) : s(s) {}    
    };
    
    int main()
    {
        MyString ms_1("hallo welt");    // ok
        MyString ms_2 = "hallo welt";   // Fehler
    
        return 0;
    }
    

    Siehe auch: http://fara.cs.uni-potsdam.de/~kaufmann//faqs/copyvsdirect.pdf



  • Gugelmoser schrieb:

    ...Siehe auch: http://fara.cs.uni-potsdam.de/~kaufmann//faqs/copyvsdirect.pdf

    👍 Sehr guter und informativer Link, so habe ich schon wieder etwas gelernt. Denn dass wusste ich auch nicht 😋

    Lg freeG



  • fr33g schrieb:

    Sehr guter und informativer Link, so habe ich schon wieder etwas gelernt. Denn dass wusste ich auch nicht 😋

    🙂

    achja fr33g, hierzu

    fr33g schrieb:

    Genau genommen ist es eine Definition mit Initialisierung( Kopierinitialisierung )

    noch etwas.
    Definition mit Defaultwert-Angabe = Initialisierung 😉



  • Gugelmoser schrieb:

    Definition mit Defaultwert-Angabe = Initialisierung 😉

    Sorry verstehe ich nicht ganz...wo war die Rede von einer Defaultwert-Angabe 😋 ?

    Lg freeG



  • deine Aussage "Definition mit Initialisierung"... das gibt es nicht ;). Und was verstehst du unter einer Kopierinitialisierung?

    Es gibt
    - die Deklaration = etwas dem Compiler bekannt machen.
    - die Definition = Deklaration + etwas erzeugen/spezifizieren
    - die Initialisierung = Definition + Defaultwertangabe



  • Ich meinte das so:

    extern int i; // Deklaration
    int j; // Definition( Speicher wird reserviert ) + Deklaration
    int k = 10; // Definition und Initialisierung, da k mit 10 initialisiert wird
    

    Ich weiß selber dass man oft sagt, wenn man

    int i;
    //....code....i wird nicht benutzt
    i = 5;
    

    schreibt, dass es unnötig ist i schon vorher zu deklarieren. Aber so wie ich es gelernt habe ist das eine Definition.
    Aber ich lasse mich gerne eines besseren belehren 😉
    Lg freeG



  • fr33g schrieb:

    Ich meinte das so:

    int k = 10; // Definition und Initialisierung, da k mit 10 initialisiert wird
    

    Nein, so darfst du das nicht sagen (schau mal meinen vorherigen post an, hab ihn editiert).

    int k = 10; // Definition mit Defaultwertangabe, da k als default 10 zugewiesen bekommt.
    

    So wird ein Schuh draus. 😉



  • Gugelmoser schrieb:

    fr33g schrieb:

    Ich meinte das so:

    int k = 10; // Definition und Initialisierung, da k mit 10 initialisiert wird
    

    Nein, so darfst du das nicht sagen (schau mal meinen vorherigen post an, hab ihn editiert).

    int k = 10; // Definition mit Defaultwertangabe, da k als default 10 zugewiesen bekommt.
    

    So wird ein Schuh draus. 😉

    "Default" paßt nicht, finde ich.



  • volkard schrieb:

    "Default" paßt nicht, finde ich.

    Wie würdest du es bezeichnen? 😉

    hmm, vielleicht ganz schlicht und einfach als Anfangswert oder Ausgangswert?



  • Also bei Punkt 1 und 2 sind wir uns ja anscheinend einig 😉

    Wäre dann

    int i(10);
    

    Eine Definition + Initialisierung und bei

    int i = 10;
    

    Wäre es eine Definition und anschließend wird i 10 zugewiesen? Wäre aber doch unlogisch, da es ja quasi in einem Schritt abläuft und damit wäre es ja doch wieder eine Initialisierung.

    Lg freeG



  • Gugelmoser schrieb:

    hmm, vielleicht ganz schlicht und einfach als Anfangswert oder Ausgangswert?

    Ja. Oder ein I-Wort.



  • 🙂 ok, Definition mit Initalwert-Angabe = Initialisierung

    [edit] Was ich im Endefekkt fr33g damit sagen wollte, ist, dass die Initialisierung eine Definition beinhaltet. Ich hoffe das kam so an. 😉



  • Also doch so wie ich dachte 😋 oder meinst du so?

    extern int i; // Deklaration
    int j; // Definition + Deklaration
    int k = 10 // Initialisierung?
    

    Wobei ich aber finde das es nicht einfach eine Initialisierung ist, da die Variable ja auch definiert wird. Weiß nicht, find es komisch bei Variante 3 einfach nur zu sagen, dass ist eine Initialisierung.

    Lg freeG



  • Gugelmoser schrieb:

    [edit] Was ich im Endefekkt fr33g damit sagen wollte, ist, dass die Initialisierung eine Definition beinhaltet. Ich hoffe das kam so an. 😉

    Ja, das kam an. Aber auch toll wäre, wenn Du sagen würdest, daß eine Definition eine Deklaration enthält.



  • fr33g schrieb:

    extern int i; // Deklaration
    int j; // Definition + Deklaration
    int k = 10 // Initialisierung?
    

    ganz genau, so meinte ich das. Wie gesagt, die Initialisierung beinhaltet auch die Definition. Man sagt, "ich initialisiere eine Variable" und meint damit "ich erzeuge sie und gebe ihr einen Anfangswert mit".



  • fr33g schrieb:

    Wobei ich aber finde das es nicht einfach eine Initialisierung ist

    Naja, wenn man streng zwischen Initialisierung und Zuweisung trennt und sich nur in unserer C++-Welt bewegt, kann man Initialisierung dazu sagen.

    Aber schon 10cm außerhalb geht das dann unter Umständen nicht mehr.



  • volkard schrieb:

    Gugelmoser schrieb:

    [edit] Was ich im Endefekkt fr33g damit sagen wollte, ist, dass die Initialisierung eine Definition beinhaltet. Ich hoffe das kam so an. 😉

    Ja, das kam an. Aber auch toll wäre, wenn Du sagen würdest, daß eine Definition eine Deklaration enthält.

    Gut, dass eine Definition eine Deklaration beinhaltet wusste ich ja schon, dass hat er aber auch nochmal oben in seinem 1. Post auf dieser Seite editiert gehabt.

    Nur noch mal zum Verständnis, man spricht also bei Variante 3 einfach von einer Initialisierung? Dachte immer dass eine Initialisierung in diesem Kontext nicht allein stehen kann sondern nur in Verbindung mit einer Definition.

    Lg freeG

    EDIT:
    Kurz gesagt, man kanns bei C++ einfach Initialisierung nennen, wenn ich aber sage Definition mit Initialisierung, dann ist es auch nicht falsch 🙂



  • volkard schrieb:

    Gugelmoser schrieb:

    [edit] Was ich im Endefekkt fr33g damit sagen wollte, ist, dass die Initialisierung eine Definition beinhaltet. Ich hoffe das kam so an. 😉

    Ja, das kam an. Aber auch toll wäre, wenn Du sagen würdest, daß eine Definition eine Deklaration enthält.

    Gugelmoser schrieb:

    Es gibt
    - die Deklaration = etwas dem Compiler bekannt machen.
    - die Definition = Deklaration + etwas erzeugen/spezifizieren


Anmelden zum Antworten