2010-09-02 1 views

Antwort

17

Nein, sie bedeuten nicht genau dasselbe.

Wenn ein Konstruktor ausgeführt wird, werden vor dem Eingeben des Codeblocks (des Codes zwischen den geschweiften Klammern) alle Objektdatenelemente erstellt. In den Initialisierern (dem Code nach dem Doppelpunkt und vor den geschweiften Klammern) legen Sie fest, welche Konstruktoren für diese Elemente verwendet werden sollen. Wenn Sie keinen Konstruktor für ein bestimmtes Datenelement angeben, wird der Standardkonstruktor verwendet.

Wenn Sie also die Initialisierungsliste (erstes Beispiel) verwenden, werden die rechten Konstruktoren für jedes Mitglied verwendet, und es ist kein zusätzlicher Code erforderlich. Wenn nicht, wird zuerst der Standardkonstruktor verwendet und dann wird der Code in den geschweiften Klammern ausgeführt.

Zusammengefasst:

  1. In Ihrem ersten Beispiel wird jedes Element mit dem entsprechenden Konstruktor initialisiert, wahrscheinlich den Kopierkonstruktor.
  2. In Ihrem zweiten Beispiel wird jedes Mitglied mithilfe des Standardkonstruktors konstruiert, und dann wird zusätzlicher Code ausgeführt, um ihn zu initialisieren, wahrscheinlich der Zuweisungsoperator.

EDIT: Sorry, habe vergessen, Ihre Fragen in der letzten Zeile zu beantworten.

Der Name des Codes zwischen dem Doppelpunkt und den geschweiften Klammern ist Initialisierungsliste.

Wenn Sie wissen, welche der richtige Konstruktor für eine Variable oder Datenelement ist, verwenden Sie es auf jeden Fall. Aus diesem Grund haben die meisten Klassen andere Konstruktoren als nur einen Standardkonstruktor. Sie verwenden also besser die Initialisierungsliste.

Die Initialisierungsliste ist fast nie langsamer als die andere Technik und kann leicht schneller sein. Eine bekannte Regel beim Schreiben von Code ist "nicht zu früh optimieren", aber es gibt ein nicht so bekanntes Gegenstück: Pessimize nicht vorzeitig. Wenn Sie zwei Optionen zum Schreiben eines Codeabschnitts haben und einer davon besser als der andere sein kann, aber keine zusätzliche Arbeit oder Komplexität erfordert, verwenden Sie ihn. In Ihrem Beispiel gibt es keinen Unterschied, da Sie einen eingebauten Typ verwenden (int). Aber wenn Sie Klassen verwenden würden, gäbe es einen Unterschied, also gewöhnen Sie sich an die Initialisierungsliste.

+1

Zusätzlich zu dem, was Gorpik schrieb ('+ 1' von mir dafür, BTW): In Sprachen wie Java und C#, wo alle Variablen _references_ sind, ist das egal, weil member Initialisierung ist sowieso nur eine Adressvergabe. In C++ sind Klassendatenelemente häufig echte Objekte, die vor Ort initialisiert werden, anstatt Referenzen (Zeiger), die initialisiert werden, um auf Objekte auf dem Heap zu verweisen. Für eine sinnvolle Implementierung von 'std :: string' könnte beispielsweise die Standard-Initialisierung gefolgt von der Zuweisung signifikant langsamer als die Initialisierung mit den richtigen Daten sein. – sbi

+0

@sbi: Nicht alle Variablen sind Referenzen in C#. Die Sprache hat auch Werttypen :) – jalf

+0

@jalf: Ich habe die Dinge absichtlich etwas vereinfacht. – sbi

3

Der ehemalige heißt Initialisierungslisten. Sie können viele Artikel dafür bekommen.

Die besonderen Gründe für Listen mit intializer sind hier gegeben http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/

Sie Effective C++ beziehen vollständige Einsicht in intializer Listen zu bekommen. Hoffe es ist klar.

+2

Wie [dies] (http://www.parashift.com/c++faq-lite/ctors.html#faq-10.6). –

+0

^^ sehr viel das ^^ –

0

BTW, sagte Bjarne Stroustrup in Die C++ Programmiersprache, die mit Initialisierungsliste einige Effizienz gewonnen werden können, und er empfahl uns Initialisierungsliste nutzen zu können!

+1

Wenn Sie eine Referenz dafür bereitstellen können, erhalten Sie möglicherweise einige Upvotes –