Kopierinitialisierung



  • Hallo!

    Ich bin gerade dabei, mein Wissen wieder aufzufrischen, und nun habe ich eine Frage. Im Buch C++ Primer steht, dass zB. folgende Anweisung eine "Kopierinitialisierung" ist, also "Die Kopierinitialisierung benutzt zunächst den passenden Konstruktor, um ein temp. Objekt zu erzeugen. Anschließend kopiert der Kopierkonstruktor dieses Objekt in das, welches wir gerade anlegen:"

    string empty_copy = string()
    

    Habe das mal nachgebaut:

    class Test1
    {
    	int x;
    public:
    	Test1()
    	{
    		cout << "DEFAULT" << endl;
    	}
    
    	Test1(int _x) : x(_x)
    	{
    		cout << "CUSTOM" << endl;
    	}
    
    	Test1(const Test1& test1)
    	{
    		cout << "COPY" << endl;
    	}
    
    	Test1& operator=(const Test1& test1)
    	{
    		cout << "ASSIGN" << endl;
    	}
    };
    
    // Benutzung
    Test1 t1 = Test1(); // Nur DEFAULT?!
    Test1 t2 = Test1(3); // Nur CUSTOM?!
    // Wo bleibt ASSIGN?
    

    Doch scheinbar wird nur ein Konstruktor aufgerufen, demnach wird gar kein temp. Objekt erzeugt?!
    Benutze VS2010, liegt es an dem? Oder kapier ich da was nicht?

    Danke schonmal!



  • Sorry, ich meine natürlich:

    // Wo bleibt COPY?
    


  • Der darf wegoptimiert werden, muss aber vorhanden und zugreifbar sein. Deklariere den copy-Ctor mal private und schau was passiert 😉



  • Ahh, verstehe. Es wird dann also quasi eine Direktinitialisierung durchgeführt.



  • Im Buch wird noch gesagt, dass bei Elementen eines std::vector der Kopierkonstruktor benutzt wird.
    Ich frage mich, warum vector das macht. Wozu eine Kopie?

    vector<Test1> v;
    
    v.push_back(3); // CUSTOM & COPY
    
    Test1* t1 = new Test1(3); // CUSTOM
    


  • !n00by schrieb:

    Im Buch wird noch gesagt, dass bei Elementen eines std::vector der Kopierkonstruktor benutzt wird.
    Ich frage mich, warum vector das macht. Wozu eine Kopie?

    vector<Test1> v;
    
    v.push_back(3); // CUSTOM & COPY
    
    Test1* t1 = new Test1(3); // CUSTOM
    

    Wie sonst? vector verwaltet für dich ja ein Array, d.h., alle Elemente müssen im Speicher zusammenhängend gespeichert werden und das Array bei Bedarf vergrößert/verkleinert werden.



  • Tippgeber schrieb:

    !n00by schrieb:

    Im Buch wird noch gesagt, dass bei Elementen eines std::vector der Kopierkonstruktor benutzt wird.
    Ich frage mich, warum vector das macht. Wozu eine Kopie?

    vector<Test1> v;
    
    v.push_back(3); // CUSTOM & COPY
    
    Test1* t1 = new Test1(3); // CUSTOM
    

    Wie sonst? vector verwaltet für dich ja ein Array, d.h., alle Elemente müssen im Speicher zusammenhängend gespeichert werden und das Array bei Bedarf vergrößert/verkleinert werden.

    Laut dieser Argumentation würde in C++0x aber auch ein Aufruf des Move-Konstruktors ausreichen :p


Anmelden zum Antworten