2010-07-07 6 views
5

acabo de leer un comment by GMan que¿Se prefieren los inicializadores vacíos para la inicialización predeterminada de miembros integrales?

class A 
{ 
public: 
    A() : 
     m_ptr() // m_ptr is implicitly initialized to NULL 
    { } 
}; 

conviene preferir el

class A 
{ 
public: 
    A() : 
     m_ptr(NULL) // m_ptr is explicitly initialized to NULL 
    { } 
}; 

Aviso la falta de NULL en el primer ejemplo.

¿Es GMan cierto? Esto podría ser un poco subjetivo, entonces "¿Prefiere los inicializadores vacíos para la inicialización predeterminada?" podría ser más apropiado.

Además, si prefiere los inicializadores vacíos, ¿esto se aplica a otros miembros integrales?

class B 
{ 
public: 
    B() : 
     m_count(), 
     m_elapsed_secs() 
    {} 
private: 
    std::size_t m_count; 
    float m_elapsed_secs; //the elapsed time since instantiation 
}; 

Por supuesto, defienda su punto de vista con una descripción de por qué uno debe preferirse sobre el otro.

+0

¿Puede alguien más creativo que yo obtener un título mejor así que dejo de obtener respuestas incorrectas? ¿Quién hubiera pensado que * podría * obtener respuestas incorrectas a una pregunta sobre mejores prácticas? –

+2

Creo que el título es claro, y la pregunta está bien escrita. Por otra parte, ya sé por qué preguntas. Las respuestas incorrectas probablemente fueron simples malentendidos del idioma, no tu pregunta. – GManNickG

Respuesta

7

prefiero lo explícito. Como algunos de las respuestas incorrectas a esta pregunta han demostrado, no es obvio para todos los que, por ejemplo, int() y int(0) son equivalentes.

supongo que no suministrar un valor explícito tiene la ventaja de que no será necesario volver a examinar la lista de inicialización si Eva r cambiar el tipo.

+0

Podría argumentar que no es necesario volver a visitar la lista de inicialización cuando el tipo cambia es negativo (cuando init predeterminado ya no es lo que desea para el nuevo tipo). –

-1

Creo que son cosas diferentes, es posible que usted está confundiendo NULL con void significa int main() es la misma que int main(void) pero NO int main(NULL) (En C++ NULL es equivalente a 0

+2

No hay definiciones de funciones en mi pregunta. Pregunto sobre la inicialización del miembro en la lista de inicialización de una clase. –

2

La inicialización predeterminada es necesaria cuando se escribe una clase de plantilla para inicializar por defecto miembros de tipos dependientes. Para otros casos, no hay una diferencia real si desea inicializar por defecto al miembro. Pero hay algunos casos en los que desea obtener un comportamiento no predeterminado.

Una muestra de inicialización por defecto cuando no es adecuado:

struct X { 
    HANDLE some_file_handle; 
    // note that INVALID_HANDLE_VALUE is not equal to 0 in Windows 
    X() : some_file_handle(INVALID_HANDLE_VALUE) {} 
}; 

En cuanto a usar NULL vs inicialización por defecto que tengo un ejemplo más: en Visual Studio 2010, que se declara que es de alguna manera conformes con C++ 0x NULL todavía se define como 0, pero en C++ 0x debe usar nullptr para inicializar punteros. Y nullptr no está definido en C++ '03. Pero probablemente quieras hacer que tu código sea portátil. En ese caso (para inicializar los punteros) preferiré una inicialización predeterminada sobre la inicialización del valor.

2

En primer lugar, dije que es posiblemente mejor, no es así. :) Además, se trataba más de deshacerse de NULL; Simplemente uso nada en lugar de 0. Pero una pregunta interesante de todos modos.

Probablemente sea solo una cuestión de estilo, pero es importante tener en cuenta, as Johannes did, que no es solo un estilo sintáctico; ellos hacen cosas diferentes Es fácil hacer que esas cosas diferentes sean iguales.

Prefiero la inicialización del valor, porque no tomo ninguna parte de cómo se inicializa el valor; Simplemente digo "ser inicializado". Por el contrario, una vez que introduce un valor, influye en la forma en que se inicializa el valor.

Creo que sería difícil encontrar una situación en la que la inicialización del valor sea claramente mejor, simplemente elija cuál le conviene más.

+0

¿Prefiere la inicialización del valor en el caso de la 'clase B'? Para mí, me sentí un poco raro al no inicializar una variable de conteo en 0. –

+2

Creo que GMan no debería responder la pregunta "¿Es GMan correcto?". Es algún tipo de recursión. :) –

+0

@Caspin: Yup. Me siento cómodo sabiendo que se inicializará a 0 de todos modos, así que siento que especificar la constante de todos modos es solo un desperdicio. :) Por otra parte, ser explícito puede ser más fácil de leer. – GManNickG

Cuestiones relacionadas