2017-03-01 5 views
-1

Aktualisiere Frage: Warum wir haben "Ich werde konstruiert". Und wo kann ich das lehnen ?. Ich lese C++ Buch an der Universität, aber ich habe das gefunden.Wie Konstruktor arbeiten

Im so leid, weil einige Fehler.

#include <vector> 
#include <string> 
#include <iostream> 

struct President { 
    std::string name; 
    std::string country; 
    int year; 

    President(std::string p_name, std::string p_country, int p_year) 
     : name(std::move(p_name)) 
     , country(std::move(p_country)) 
     , year(p_year) 
    { 
     std::cout << "I am being constructed.\n"; 
    } 
    President(President&& other) 
     : name(std::move(other.name)) 
     , country(std::move(other.country)) 
     , year(other.year) 
    { 
     std::cout << "I am being moved.\n"; 
    } 
    President& operator=(const President& other) = default; 
}; 

int main() 
{ 
    std::vector<President> reElections; 
    std::cout << "\npush_back:\n"; 
    reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936)); 

    for (President const& president : reElections) { 
     std::cout << president.name << " was re-elected president of " 
        << president.country << " in " << president.year << ".\n"; 
    } 
} 

Ausgang:

push_back: ich gebaut bin zu werden. Ich werde bewegt.

\ nDanke Ihnen so sehr.

+0

Was verwirrt Sie? Die Konstruktorfunktion heißt hier: 'President (" Franklin Delano Roosevelt "," die USA ", 1936)' –

+0

Wenn Sie ein * Objekt *, eine * Instanz * einer Klasse erstellen, wird dieses Objekt * konstruiert * und das entsprechende Konstruktor wird aufgerufen. –

+0

Sie haben Ihr Beispiel von cppreference. cplusplus.com/reference und cppreference.com sind die zwei verschiedenen, konkurrierenden, online C++ - Referenzen – Cubbi

Antwort

1

Das Erstellen einer Klasseninstanz ruft automatisch den Konstruktor auf. In Ihrem Programmkonstruktor von „Präsident“ genannt wird, wenn Sie sind ein Element des Vektors mit emplacing „Nelson Mandela, und wenn zurück drängen“ Franklin Roosevelt“.

+0

Es tut mir leid, weil mein Fehler. Ich war Update-Frage –

1

Das Beispiel hier wahrscheinlich beabsichtigt, zu zeigen, dass std::vector::emplace_back Konstrukte vorhanden, aber push_back bewegt

Wir können mehr Detail sehen, was passiert, die (ausführlichere) Version von Präsident

struct President { 
    std::string name; 
    std::string country; 
    int year; 

    President(std::string p_name, std::string p_country, int p_year) 
     : name(std::move(p_name)) 
     , country(std::move(p_country)) 
     , year(p_year) 
    { 
     std::cout << "I am being constructed at " << this << ".\n"; 
    } 
    President(President&& other) 
     : name(std::move(other.name)) 
     , country(std::move(other.country)) 
     , year(other.year) 
    { 
     std::cout << "I am being moved from " << &other << " to " << this << ".\n"; 
    } 
    President(const President& other) 
     : name(other.name) 
     , country(other.country) 
     , year(other.year) 
    { 
     std::cout << "I am being copied from " << &other << " to " << this << ".\n"; 
    } 
    ~President() 
    { 
     std::cout << "I am being destructed at " << this << ".\n"; 
    } 
}; 

Beispiel Ausgabe mit:.

emplace_back: 
I am being constructed at 0x2b2b57e17c30. 

push_back: 
I am being constructed at 0x7ffcb9a0cec0. 
I am being moved from 0x7ffcb9a0cec0 to 0x2b2b57e17cb0. 
I am being destructed at 0x7ffcb9a0cec0. 

Contents: 
Nelson Mandela was elected president of South Africa in 1994. 
Franklin Delano Roosevelt was re-elected president of the USA in 1936. 
I am being destructed at 0x2b2b57e17cb0. 
I am being destructed at 0x2b2b57e17c30. 
+0

Es tut mir leid, weil mein Fehler. Ich war eine Update-Frage –

Verwandte Themen