2010-11-27 11 views
8

Duplicar posible:
Benefits of Initialization lists¿Ventajas de utilizar la lista de inicializadores?

Me preguntaba si había una ventaja para inicializar los miembros de la lista de inicialización más de ponerlos en el constructor. Ciertas cosas tienen que usar la lista de inicialización, pero para la mayoría de las cosas que no, ¿hay alguna diferencia? Prefiero este último porque cuando tengo varios constructores, prefiero simplemente llamar a constructo() para promover la reutilización del código.

Gracias

Respuesta

12

Si no usa la lista de inicializadores, el miembro o la clase base se construye por defecto antes de la llave de apertura.

Por lo tanto, sus llamadas para configurarlo más tarde agregarán una llamada operator=().

Si usa la lista de inicializadores, el miembro o la clase base tiene el constructor adecuado llamado.

Dependiendo de sus clases, esto puede ser necesario o más rápido.

+0

Sería útil si pudiera proporcionar un ejemplo de muestra. –

10

Por primitivas, no hay ninguna diferencia entre el uso de listas de inicializador o la construcción de ellos a través de la asignación.

Para otros tipos, las listas de inicializadores pueden proporcionarle mejoras de rendimiento al construir objetos.

Tenga en cuenta que el orden de inicialización (en las listas de inicializadores) depende del orden de declaración en la clase. Si las declaraciones están fuera de servicio y necesita construir datos que dependan de otra cosa que ya se esté inicializando de antemano, esa es una excepción a la 'lista de inicialización de uso cuando sea posible'.

Más información: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6

+0

Excelente respuesta. Un punto que quisiera agregar ... podría tener sentido (basado en el número de constructores que tenga) poner la parte del constructor que asigna valores a las primativas en una función privada Init().Esto previene la duplicación de código en las listas de inicializadores. –

+0

@birryree punto agradable sobre la secuencia de argumentos ¿podría explicar las ventajas de utilizar la lista de inicializadores en el caso de tipos no primitivos? –

1

aparte de ser obligado a utilizar una lista de inicialización para las constantes y referencias, es también útil porque con ella se evita por defecto la construcción de objetos miembro antes de entrar en el constructor y luego inmediatamente la asignación, lo cual puede ser ineficiente si los objetos miembros son caros de construir

2

Aparte de lo que todos los demás han mencionado, que permite la desambiguación de la variable de sombra, así que donde tendría que escribir this->var = var en su lugar puede hacer myclass(int var) : var(var). Por supuesto, algunas personas pueden encontrar esto muy confuso/difícil de leer si tiene un gran constructor

2

Además, nunca realice la adquisición de recursos no administrados en las listas de inicializadores. En otras palabras, use "la adquisición de recursos es la inicialización" (evitando así por completo los recursos no administrados) o bien realice la adquisición de recursos en el cuerpo del constructor.

Y warning # 2 Realice cada asignación de recursos (por ejemplo, nueva) en su propia declaración de código que inmediatamente le da el nuevo recurso a un objeto de administrador (por ejemplo, auto_ptr).

http://www.gotw.ca/gotw/056.htm

Cuestiones relacionadas