variable una tipos que programacion lenguaje funciones ejemplos declaracion datos clases c++ c terminology

c++ - tipos - que es una variable en programacion



Las diferencias entre inicializar, definir, declarar una variable (4)

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


Declaración

La declaración, en general, se refiere a la introducción de un nuevo nombre en el programa. 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 de C ++, en §3.1 / 1 como:

Una declaración (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 declaración). 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 declaración 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 declaración de nombre de clase (9.1), es una declaración enum opaco (7.2), es un parámetro de plantilla (14.1), es un parámetro- declaración (8.3.5) en un declarador de función que no es el declarador de una definición de función, o es una declaración de tipodef (7.1.3), una declaración de alias (7.1.3), una declaración de uso (7.3. 3), una static_assert-declaration (cláusula 7), una declaración de atributo (cláusula 7), una declaración 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 declaración 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 "declaración". 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 declaración más inicialización.


"Entonces, significa que la definición es igual a declaración más inicialización".

No necesariamente, su declaración puede ser sin que se inicialice ninguna variable como:

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


La declaración 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 declaración:

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 declaración especifica la interpretación y los atributos de un conjunto de identificadores. Una definición de identificador es una declaración 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) declaración del identificador;

  • para un nombre typedef, es la primera (o única) declaración 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 declaración introduce un identificador y proporciona información al respecto. Para una variable, una definición es una declaración 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 igual a 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 declaración más la inicialización.