Las diferencias entre inicializar, definir, declarar una variable

Después de leer la pregunta , sé las diferencias entre la statement y la definición. Entonces, ¿significa que la definición es igual a statement más inicialización?

Declaración

La statement, en general, se refiere a la introducción de un nuevo nombre en el progtwig. Por ejemplo, puede declarar una nueva función describiendo su “firma”:

void xyz(); 

o declarar un tipo incompleto:

 class klass; struct ztruct; 

y por último, pero no menos importante, declarar un objeto:

 int x; 

Se describe, en el estándar C ++, en §3.1 / 1 como:

Una statement (cláusula 7) puede introducir uno o más nombres en una unidad de traducción o redeclarar nombres introducidos por declaraciones anteriores.

Definición

Una definición es una definición de un nombre previamente declarado (o puede ser tanto definición como statement). Por ejemplo:

 int x; void xyz() {...} class klass {...}; struct ztruct {...}; enum { x, y, z }; 

Específicamente, el estándar C ++ lo define, en §3.1 / 1, como:

Una statement es una definición a menos que declare una función sin especificar el cuerpo de la función (8.4), contenga el especificador externo (7.1.1) o una especificación de vinculación25 (7.5) y ni un inicializador ni un cuerpo de función, declara un miembro de datos estáticos en una definición de clase (9.2, 9.4), es una statement de nombre de clase (9.1), es una statement enum opaco (7.2), es un parámetro de plantilla (14.1), es un parámetro- statement (8.3.5) en un declarador de función que no es el declarador de una definición de función, o es una statement de tipodef (7.1.3), una statement de alias (7.1.3), una statement de uso (7.3. 3), una static_assert-declaration (cláusula 7), una statement de atributo (cláusula 7), una statement vacía (cláusula 7) o una directiva de utilización (7.3.4).

Inicialización

La inicialización se refiere a la “asignación” de un valor, en el momento de la construcción. Para un objeto genérico de tipo T , a menudo tiene la forma:

 T x = i; 

pero en C ++ puede ser:

 T x(i); 

o incluso:

 T x {i}; 

con C ++ 11.

Conclusión

Entonces, ¿significa que la definición es igual a statement más inicialización?

Depende. De lo que estás hablando. Si está hablando de un objeto, por ejemplo:

 int x; 

Esta es una definición sin inicialización. Lo siguiente, en cambio, es una definición con inicialización:

 int x = 0; 

En cierto contexto, no tiene sentido hablar de “inicialización”, “definición” y “statement”. Si está hablando de una función, por ejemplo, la inicialización no significa mucho.

Entonces, la respuesta es no : definición no significa automáticamente statement más inicialización.

La statement dice “esto existe en algún lado”:

 int foo(); // function extern int bar; // variable struct T { static int baz; // static member variable }; 

La definición dice “esto existe aquí, haz memoria para eso”:

 int foo() {} // function int bar; // variable int T::baz; // static member variable 

La inicialización es opcional en el punto de definición de objetos, y dice “aquí está el valor inicial para esta cosa”:

 int bar = 0; // variable int T::baz = 42; // static member variable 

Algunas veces es posible en el momento de la statement:

 struct T { static int baz = 42; }; 

… pero eso se está convirtiendo en características más complejas.

Para C, al menos, por C11 6.7.5:

Una statement especifica la interpretación y los atributos de un conjunto de identificadores. Una definición de identificador es una statement para ese identificador que:

  • para un objeto, hace que el almacenamiento se reserve para ese objeto;

  • para una función, incluye el cuerpo de la función;

  • para una constante de enumeración, es la (única) statement del identificador;

  • para un nombre typedef, es la primera (o única) statement del identificador.

Por C11 6.7.9.8-10:

Un inicializador especifica el valor inicial almacenado en un objeto … si un objeto que tiene almacenamiento automático no se inicializa explícitamente, su valor es indeterminado.

Entonces, en términos generales, una statement introduce un identificador y proporciona información al respecto. Para una variable, una definición es una statement que asigna almacenamiento para esa variable.

La inicialización es la especificación del valor inicial que se almacenará en un objeto, que no es necesariamente el mismo que la primera vez que le asigna explícitamente un valor. Una variable tiene un valor cuando la define, ya sea que le otorgue un valor explícitamente o no. Si no le da un valor explícito y la variable tiene almacenamiento automático, tendrá un valor inicial, pero ese valor será indeterminado. Si tiene almacenamiento estático, se inicializará implícitamente según el tipo (por ejemplo, los tipos de puntero se inicializan a punteros nulos, los tipos aritméticos se inicializan a cero, y así sucesivamente).

Por lo tanto, si define una variable automática sin especificar un valor inicial, como por ejemplo:

 int myfunc(void) { int myvar; ... 

Lo está definiendo (y, por lo tanto, también lo está declarando, ya que las definiciones son declaraciones), pero no lo está inicializando. Por lo tanto, la definición no es igual a la statement más la inicialización.

“Entonces, significa que la definición es igual a statement más inicialización”.

No necesariamente, su statement puede ser sin que se inicialice ninguna variable como:

  void helloWorld(); //declaration or Prototype. void helloWorld() { std::cout << "Hello World\n"; }