2012-07-30 15 views
29

Frage> Was ist der richtige Weg, um die Vektorelementvariable der Klasse zu initialisieren? Müssen wir es überhaupt initialisieren?Korrekter Weg zum Initialisieren der Vektorelementvariable

+1

Nein, es sei denn, Sie möchten eine Anfangskapazität angeben (oder dessen Inhalt initialisieren, was Sie mit Initialisierungslisten in C++ 11 oder Boosts "list_of" I _think_ tun können). – hmjd

+2

Der Vektor beider Wege wird unter Verwendung des Standardkonstruktors konstruiert, aber 1. wird bevorzugt –

+1

@ Mr.Anubis: Nicht von mir. –

Antwort

21

Siehe http://en.cppreference.com/w/cpp/language/default_initialization

Standard Initialisierung in drei Situationen durchgeführt:

  1. wenn Eine Variable mit automatischer Speicherdauer wird ohne Initialisierer
  2. deklariert, wenn ein Objekt mit dynamischer Speicherdauer von einem neuen Ausdruck ohne erstellt wird Ein Initialisierer
  3. , wenn eine Basisklasse oder ein nicht statisches Datenelement in einer Konstruktorinitialisierungsliste nicht erwähnt wird und dieser Konstruktor heißt.

Die Auswirkungen der Standardinitialisierung sind:

  • Wenn T ein Klassentyp ist, wird der Standard-Konstruktor den Anfangswert für das neue Objekt zu schaffen, genannt.
  • Wenn T ein Array-Typ ist, wird jedes Element des Arrays standardmäßig initialisiert.
  • Ansonsten wird nichts getan.

Da std::vector ist eine Klasse, geben Sie den Standard-Konstruktor aufgerufen wird. Daher wird die manuelle Initialisierung nicht benötigt.

+0

Überraschung für mich, dass 'Klasse T2 { int mem; public: T2() {} // "mem" nicht in Initialisierungsliste }; 'const T2 t2; // ok, ruft den vom Benutzer bereitgestellten Standard ctor // t2.mem ist default-initialisiert' – q0987

+0

Ich habe gerade den obigen Code in VS2010 getestet und es ist falsch. Das t2.mem wird NICHT standardmäßig initialisiert! – q0987

+1

@ q0987: 'mem' ist ein' int', es ist weder eine Klasse noch ein Array-Typ, daher wird es nicht standardmäßig initialisiert. Der Code, der auf cppreference zur Verfügung gestellt wird, ist fast immer nach dem C++ 11-Standard verifiziert, aber ich weiß nicht, ob sich dies für den gegebenen Fall ändert (vorausgesetzt, das 'const'-Qualifikationsmerkmal). Aber selbst wenn das Beispiel \t inkonsistent und vielleicht sogar falsch ist, sind die Erklärung und der Standard selbst nicht. – Zeta

1

Sie müssen es nicht explizit initialisieren, es wird erstellt, wenn Sie eine Instanz Ihrer Klasse erstellen.

17

Kommt drauf an. Wenn Sie einen Vektor der Größe 0 wollen, müssen Sie nichts tun. Wenn Sie wollten, sagen wir, verwenden Sie eine Größe N Vektorfüllung von 42s dann den Konstruktor initializer Listen:

ClassName() : m_vecInts(N, 42) {} 
Verwandte Themen