¿Es correcto decir que una variable es una instancia de un tipo de datos?


9

(que puede cambiar su valor en el transcurso del programa)

¿O la 'instancia de algo' está estrictamente relacionada con las clases y los objetos? Si es así, ¿cómo definiría el concepto de 'variable' cuando se trata de C ++?


C # y Java difieren de C ++ en dos formas interesantes. Primero, intentan unificar los tipos primitivos con los tipos de objeto (y estructura) (para que pueda hablar sobre una instancia de int), mientras que C ++ no. En segundo lugar, en C # y Java, las variables de tipos de objeto son referencias implícitas a instancias (de clases) en el montón y también que no hablamos de punteros a objetos, mientras que en C ++, como la respuesta de @ coredump, las variables locales de tipos de objeto son enlaces a instancias en la pila, y distinguimos explícitamente entre objetos y punteros a objetos.
Erik Eidt

Respuestas:


8

Hasta donde sé, es correcto llamar valores de instancias de tipos primitivos de ese tipo (ver, por ejemplo, "Sistema de tipos C ++" , del manual de Visual Studio, pero todavía estoy buscando otra fuente), aunque creo que este término es se usa principalmente cuando se discuten objetos. Un objeto es una instancia de una clase C si se creó a partir de un constructor definido en la clase C o en una de sus subclases.

Una variable en C ++ no es un concepto de tiempo de ejecución. Existe dentro de su compilador como un enlace léxico entre el nombre de la variable y una ubicación abstracta (mutable si no constante). Una vez que se compila un programa, las variables ya no están allí. En cambio, los datos se leen y escriben en registros, memoria, etc.


2
" Por lo general, no se dice que los valores de los tipos primitivos sean instancias de ese tipo; está reservado a objetos y clases " . Eso no es cierto en absoluto. En ninguna parte del estándar están los valores de tipos primitivos no considerados objetos. La definición de una variable tampoco cambia de ninguna manera dependiendo de si es una clase definida por el usuario o un tipo primitivo.
Nicol Bolas

@NicolBolas Nunca escuché a nadie referirse a los enteros como instancias de algo en el contexto de C ++, y estoy bastante seguro de que es correcto decir que no son instancias de nada, incluso si el estándar no lo menciona explícitamente. Si no, ¿de qué son instancias? Tampoco veo dónde esta respuesta afirma que la definición de una variable cambia entre tipos primitivos y objetos; parece ser (afaik correctamente) afirmando que las "instancias" simplemente no tienen nada que ver con la definición de una variable.
Ixrec

2
@Ixrec: " Si no, ¿de qué son instancias? " El tipo int. El estándar C ++ no distingue entre tipos primitivos y tipos no primitivos cuando se habla de lo que hacen las declaraciones de variables. Entonces T t;declara un objeto de tipo T, sin importar qué tipo Tsea.
Nicol Bolas

1
@ Ixrec: Tenga en cuenta que los literales son un tipo diferente de cosas. Los literales son una especie de prvalue. Pero no puedes hacer variables literales, así que esa es una discusión diferente.
Nicol Bolas

5

¿O la 'instancia de algo' está estrictamente relacionada con las clases y los objetos? Si es así, ¿cómo definiría el concepto de 'variable' cuando se trata de C ++?

Para decirlo de la manera más concisa posible para C ++

  • Una variable es un nombre (en código) para una ubicación en la memoria que se determinará en tiempo de ejecución.
  • Una instancia es un objeto que reside en la memoria en tiempo de ejecución.

Solo para aclarar:

  • No todas las áreas de la memoria contienen objetos. Por ejemplo, algunas áreas de la memoria pueden contener valores 'basura'.
  • No todos los objetos de almacenamiento de memoria tendrán un nombre en el código. Los objetos pueden residir en áreas de memoria sin nombre, como una posición en una matriz, o en algún lugar del montón al que hace referencia un puntero.
  • Cuando un área de memoria contiene basura, generalmente es porque no se ha inicializado ningún objeto en esa ubicación o porque se ha destruido algún objeto previamente existente.

1
Los POD son objetos en C ++. No todas las regiones de la memoria son objetos, pero los POD no son solo regiones de la memoria.
Nicol Bolas

1
Segundo NicolBolas: los POD son objetos. Sin embargo, tiene un punto cuando habla de un malloc()búfer recién editado pero no inicializado: es un área de memoria que aún no es un objeto. Del mismo modo, un objeto que ha sido explícitamente destruido: es una región de memoria que ya no es un objeto.
cmaster - reinstalar a monica el

Comentario justo de @NicolBolas, he cambiado ligeramente esa redacción
Ben Cottrell

1

Bueno, ¿qué significa "correcto"?

Si queremos ser muy estrictos al respecto, debemos distinguir entre:

  • El lado de la sintaxis : las expresiones tienen tipos (estáticos)
  • El lado semántico : los objetos son instancias de clases

De manera que una variable de ser una expresión sería tener un tipo. Su valor, el objeto al que se refiere, sería una instancia de alguna clase. Y tenga en cuenta que el tipo de la variable y la clase del objeto generalmente no son lo mismo: el tipo estático de la variable pone un límite superior en las clases de tiempo de ejecución de los objetos, por lo que las clases deben ser un subtipo de la clase que corresponde al tipo.

¿Quieres repetir ese gran bocado todo el tiempo? Diablos no. Cuán estrictamente vs. libremente queremos hablar depende del contexto. Muy a menudo no hay problema en decir que "la variable es una instancia de este tipo". Lo que sucede allí realmente es que estamos usando la variable y el tipo metonímicamente para referirnos al objeto y a una superclase de su clase de tiempo de ejecución.


1

A menos que quieras pasar toda tu vida en purismo y sofisma ... sí.

Cada vez que guarda algo que se identifica de manera única, se usa para falsificar otras cosas identificables de manera única que está creando instancias.

  • Un proyecto instanciado en productos
  • Una fuente instanciada en ejecutables
  • Una plantilla instanciada en tipos.
  • Una instancia de tipo en variables.

Algunas de esas instancias pueden tener nombres más precisos, pero en general esto funciona.


0

Muchas personas reservan "instancia" para instancias de clases. Si lo hace, en C ++, una variable podría ser una instancia de una clase, una referencia a una instancia, un puntero a una instancia o un tipo primitivo (es probable que cuente estructuras como clases en ese contexto, son casi completamente igual). En Java u Objective-C, las variables nunca serían instancias, sino posiblemente referencias a instancias.

Olvidó: por un corto tiempo, un puntero de C ++ puede ser un puntero a la memoria sin procesar, por ejemplo "esto" antes de que el constructor comience a ejecutarse. Es probable que todavía no llame a * this una instancia en este momento.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.