c++ initialization language-lawyer declaration terminology

c++ - int x; int y int*ptr; No es la inicialización, ¿verdad?



initialization language-lawyer (4)

Estoy leyendo ''C ++ All-in-One for Dummies'' de JP Mueller y J. Cogswell y me topé con esto:

#include <iostream> using namespace std; int main() { int ExpensiveComputer; int CheapComputer; int *ptrToComp; ...

Este código comienza con la inicialización de todas las golosinas involucradas: dos enteros y un puntero a un entero.

Solo para confirmar, esto es un error y debe leerse ''... al declarar'', ¿verdad? Es simplemente extraño para mí que tales errores básicos sigan llegando a los libros.


Derecha. Por lo tanto, "maniquíes". :)

Ni siquiera podemos culpar de esto al legado; históricamente, los programadores C declararían una variable y luego la "inicializarían" más tarde con su primera asignación.

Pero nunca se dio el caso de que simplemente declarar una variable, sin un inicializador, se considerara que la "inicializaba". **

Así que la redacción es simplemente incorrecta.

* Técnicamente estamos hablando de definiciones , pero cuando decimos "declarar una variable" casi siempre nos referimos a definir declaraciones.

** Aunque los objetos con duración de almacenamiento estático experimentan su propia fase de inicialización de cero antes de que ocurra cualquier otra cosa, por lo que renunciar a la inicialización por sí mismo no es una catástrofe en ese caso. Sin embargo, no podemos afirmar que hayamos inicializado ese objeto.


Desde el punto de vista del idioma, esta es la inicialización predeterminada . El problema es que están inicializados a valores indeterminados.

de lo contrario, no se hace nada: los objetos con duración de almacenamiento automático (y sus subobjetos) se inicializan a valores indeterminados.

La inicialización predeterminada de las variables que no pertenecen a la clase con la duración del almacenamiento dinámico y automático produce objetos con valores indeterminados (los objetos estáticos y de subprocesos locales se inicializan en cero)

Tenga en cuenta que cualquier intento de leer estos valores indeterminados lleva a UB .

De la norma, [dcl.init]/7

Para inicializar por defecto un objeto de tipo T significa:

  • Si T es un tipo de clase (posiblemente cv calificado) ([clase]), se consideran constructores. Los constructores correspondientes se enumeran ([over.match.ctor]), y el mejor para el inicializador () se elige mediante la resolución de sobrecarga ([over.match]). El constructor así seleccionado se llama, con una lista de argumentos vacía, para inicializar el objeto.

  • Si T es un tipo de matriz, cada elemento se inicializa por defecto.

  • De lo contrario, no se realiza ninguna inicialización.


Este código declara y define tres variables pero no las inicializa (se dice que sus valores son indeterminados ).

Una declaración de variable solo debe incluir la palabra clave extern .