2010-02-28 14 views
15

Ich lerne immer noch C++ und versuche es zu verstehen. Ich war auf der Suche durch einige Code und sah:Variablen nach dem Doppelpunkt in einem Konstruktor

point3(float X, float Y, floatZ) : 
x(X), y(Y), z(Z) // <----- what is this used for 
{ 
} 

Was ist die Bedeutung der ist "x (X), y (Y), z (Z)" neben den Konstruktor der Parameter zu sitzen?

+1

Duplizieren von http://stackoverflow.com/questions/1272680/c-constructor-syntax-question-noob. Siehe auch http://StackOverflow.com/Questions/1632484/C-Initialization-Question – outis

Antwort

17

Es ist eine Möglichkeit zum Aufrufen der Konstruktoren der Mitglieder der Klasse point3. wenn x, y und z Schwimmer ist, dann ist dies nur eine effizientere Art und Weise des Schreibens dieses

point3(float X, float Y, float Z): 
{ 
    x = X; 
    y = Y; 
    z = Z; 
} 

Aber wenn x, y & z Klassen sind, dann ist dies der einzige Weg, um Parameter in ihre Konstrukteure weitergeben

+0

Zur Verdeutlichung: Wenn die Member nicht-PoD-Typen sind, werden die Member nicht standardmäßig erstellt und ein Copy-Konstruktor muss nicht für diese Member aufgerufen werden, wenn Sie eine Initialisierungsliste verwenden. Daher ist es effizienter. – greyfade

+1

** 'PoD' =" einfache alte Daten " – isomorphismes

4

In Ihrem Beispiel point3 ist die constructor der Klasse mit dem gleichen Namen (point3) und das Zeug auf der rechten Seite des Kolons : vor der öffnenden Klammer { die initialization list ist, was wiederum Konstrukten (dh initialisiert) point3 ‚s Mitgliedsvariablen (und auch Argumente für Konstrukteure in der Basisklasse zu übergeben [es], falls vorhanden verwendet werden kann.

)
9

Initialization list

This Artikel (ein muss al lesen) So erklärt Member-Initialisierungslisten

+3

Leider muss der Artikel nicht mehr gelesen werden, und die Initialisierungslistenseite wurde nicht geladen, wenn ich das lese. Können Sie Ihre Antwort so erweitern, dass tote Links kein Problem sind? – Ceribia

0

Mitglied Initialisierung wie andere hingewiesen haben. Aber es ist wichtiger, die Folgendes zu wissen:

Wenn die Argumente vom Typ float oder anderen eingebauten Typen gibt, außer dass mit Memberinitialisierungsliste keine klaren Vorteile ist, anstatt Zuordnung (im Körper des Konstrukteurs) ist in C++ idiomatischer.

Der klare Vorteil ist, wenn die Argumente von benutzerdefinierten Klassen sind, würde diese Elementinitialisierung Aufrufe zum Kopieren von Konstruktoren im Gegensatz zu Standardkonstruktoren ergeben, wenn sie mit Zuweisungen (im Konstruktorkörper) ausgeführt werden.