¿Qué significan las siguientes frases en C ++: cero, por defecto y inicialización de valores?

StackOverflow https://stackoverflow.com/questions/1613341

  •  06-07-2019
  •  | 
  •  

Pregunta

¿Qué significan las siguientes frases en C ++:

  • inicialización-cero ,

  • inicialización predeterminada, y

  • value-initialization

¿Qué debe saber un desarrollador de C ++ sobre ellos?

¿Fue útil?

Solución

Una cosa a tener en cuenta es que la "inicialización del valor" es nueva con el estándar C ++ 2003; no existe en el estándar original de 1998 (creo que podría ser la única diferencia que es más que una aclaración). Consulte Kirill V. La respuesta de Lyadvinsky para las definiciones directamente de la norma.

Vea esta respuesta anterior sobre el comportamiento del operador nuevo para obtener detalles sobre el comportamiento diferente de este tipo de inicialización y cuándo se activan (y cuándo difieren de c ++ 98 a C + +03):

El punto principal de la respuesta es:

  

Algunas veces la memoria devuelta por el nuevo operador se inicializará, y otras veces no dependiendo de si el tipo que estás actualizando es un POD, o si es una clase que contiene miembros de POD y está usando un compilador constructor por defecto generado.

     
      
  • En C ++ 1998 hay 2 tipos de inicialización: cero y predeterminado
  •   
  • En C ++ 2003, se agregó un tercer tipo de inicialización, la inicialización del valor.
  •   

Para decir lo menos, es bastante complejo y cuando los diferentes métodos se activan son sutiles.

Una cosa a la que hay que tener cuidado es que MSVC sigue las reglas de C ++ 98, incluso en VS 2008 (VC 9 o cl.exe versión 15.x).

El siguiente fragmento de código muestra que MSVC y Digital Mars siguen las reglas de C ++ 98, mientras que GCC 3.4.5 y Comeau siguen las reglas de C ++ 03:

#include <stdio.h>
#include <string.h>
#include <new>

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

int main()
{
    char buf[sizeof(B)];
    memset( buf, 0x5a, sizeof( buf));

    // use placement new on the memset'ed buffer to make sure 
    //  if we see a zero result it's due to an explicit 
    //  value initialization
    B* pB = new(buf) B();   //C++98 rules - pB->m is uninitialized
                            //C++03 rules - pB->m is set to 0
    printf( "m  is %d\n", pB->m);
    return 0;
}

Otros consejos

Estándar C ++ 03 8.5 / 5:

  

Para cero-inicializar un objeto de tipo T significa:
  - si T es un tipo escalar (3.9), el objeto se establece en el valor de 0 (cero) convertido a T;   - si T es un tipo de clase no sindicalizada, cada miembro de datos no estáticos y cada subobjeto de clase base se inicializan con cero;   - si T es un tipo de unión, el primer miembro de datos nombrado del objeto tiene inicialización cero;
  - si T es un tipo de matriz, cada elemento se inicializa con cero;   - Si T es un tipo de referencia, no se realiza ninguna inicialización.

     

Para default-initialize un objeto de tipo T significa:
  - si T es un tipo de clase no POD (cláusula 9), se llama al constructor predeterminado para T (y la inicialización no es correcta si T no tiene un constructor por defecto accesible);   - si T es un tipo de matriz, cada elemento está inicializado por defecto;
  - De lo contrario, el objeto es cero inicializado.

     

Para value-initialize un objeto de tipo T significa:
  - si T es un tipo de clase (cláusula 9) con un constructor declarado por el usuario (12.1), entonces se llama al constructor predeterminado para T (y la inicialización está mal formada si T no tiene un constructor por defecto accesible);   - si T es un tipo de clase sin unión sin un constructor declarado por el usuario, entonces cada miembro de datos no estáticos y componente de clase base de T se inicializa con valor;   - si T es un tipo de matriz, entonces cada elemento tiene un valor inicializado;
  - De lo contrario, el objeto está inicializado con cero

     

Un programa que solicita la inicialización predeterminada o la inicialización de valor de una entidad de tipo de referencia está mal formado. Si T es un tipo calificado como CV, la versión no calificada de CV de T se usa para estas definiciones de inicialización cero, inicialización predeterminada e inicialización de valor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top