2010-02-28 20 views
15

Todavía estoy aprendiendo C++ y tratando de entenderlo. Yo estaba buscando a través de algún código y vi:Variables después del colon en un constructor

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

Cuál es el significado de la "X (X), Y (y), z (Z)" sentado al lado de los parámetros del constructor?

+1

Duplicado de http://stackoverflow.com/questions/1272680/c-constructor-syntax-question-noob. Véase también http://stackoverflow.com/questions/1632484/c-initialization-question – outis

Respuesta

17

Es una forma de invocar a los constructores de miembros de la clase point3. si x, y, z son los flotadores, entonces esto es sólo una manera más eficiente de escribir este

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

Pero si x, y & z son clases, entonces esta es la única forma de pasar parámetros en sus constructores

+0

Para aclarar: si los miembros no son tipos PoD, los miembros no se construirán por defecto y no será necesario invocar un constructor de copias en esos miembros si usa una lista de inicialización. Por lo tanto, es más eficiente. – greyfade

+1

** 'PoD' =" datos antiguos simples " – isomorphismes

4

En su ejemplo point3 es el constructor de la clase con el mismo nombre (point3), y la materia a la derecha de los dos puntos : antes del paréntesis de apertura { es el initialization list, que en construcciones de giro (es decir, inicializa) point3 variables miembro 's (y también puede ser usado para pasar argumentos a constructores en la clase base [ES], en su caso.)

9

Initialization list

This artículo (a debe leer) al por lo que explica las listas de inicialización de miembros

+3

Desafortunadamente, el artículo que debe leer ya no está allí y la página de la lista de inicialización no se estaba cargando cuando leí esto. ¿Puedes ampliar tu respuesta para que los enlaces muertos no sean un problema? – Ceribia

0

Inicialización de miembros como otros han señalado. Pero es más importante saber lo siguiente:

Cuando los argumentos son del tipo float u otros tipos incorporados, no hay ventajas claras excepto que se usa inicialización de miembro en lugar de asignación (en el cuerpo del constructor) es más idiomático en C++.

La clara ventaja es que si los argumentos son de clases definidas por el usuario, esta inicialización de miembro daría lugar a llamadas para copiar constructores en lugar de constructores predeterminados si se hace usando asignaciones (en el cuerpo del constructor).

Cuestiones relacionadas