Objetos en programación

C++

  • Definición: un objeto es una región de memoria con una semántica asociada.
  • Región de memoria: es un término genérico, pero se refiere a un espacio de memoria accesible por la CPU. Por tanto: ROM / RAM o Registros. Como la unidad mínima es el byte, este espacio tendrá un número entero de bytes.
  • Semántica asociada: qué significan los posibles valores almacenados en el objeto, y qué operaciones están lógicamente permitidas sobre ese objeto (y, por tanto, qué otras cosas no lo están). Es la forma de explicar qué significa cualquier valor concreto de ese objeto y, también, de definir el conjunto de valores válidos posibles (a lo que se llama, los invariantes de un objeto)

Los programas crean, destruyen, se refieren a, y manipulan objetos.

Nota: para referirse a un objeto en memoria, sin importar cuanto ocupa, se indica siempre la dirección de su primer byte. Como sabemos su tamaño, sabiendo su primer byte, podemos leerlo o modificarlo sin equivocarnos.

Un objeto en C++ tiene:

  • Tamaño (size): número de bytes que ocupa. Se puede saber usando el operador sizeof.
  • Alineamiento requerido (alignment): múltiplo de byte en memoria donde puede ser ubicado el inicio del objeto. Se puede saber usando el operador alignof.
  • Duración de almacenamiento (storage duration): es una condición que determina cuánto tiempo será válido el objeto.
    • Automático (automatic): se crea en un ámbito (scope) y se destruye al terminar ese ámbito. Solemos llamarlo "local",
    • Estático (static): se crea antes de empezar main y se destruye tras terminar main. Tiene la misma duración que el programa en memoria.
    • Dinámico (dynamic): lo creamos y destruimos manualmente a conveniencia (con new / malloc y delete / free).
    • Local a hilo (thread-local): que pertence exclusivamente a un hilo de ejecución, y su creación y destrucción dependerá del hilo.
  • Tiempo de vida (lifetime): tiempo concreto desde que un objeto se crea hasta que se destruye. Tiene dos posibles condiciones:
    • Está limitado por el tipo de duración de almacenamiento (storage duration) del objeto.
    • Puede ser temporal: en objetos que sólo existen durante la evaluación de la expresión en que están involucrados.
  • Tipo (type): clase dentro de los posibles tipos de objeto. Determina los invariantes y el conjunto de operaciones válidas.
  • Valor (value): el valor que tiene el objeto en un instante, que puede ser indeterminado, por ejemplo, en la inicialización por defecto (default-initialized)
  • Nombre (name) --Opcional--: los objetos pueden tener un nombre y, entonces, pueden ser variables.

Variable: un objeto o referencia que se introduce con una (declaration) y que no es ni un dato miembro, ni un miembro no-estatico.

Nota: un dato miembro es un campo de una estructura o clase, que no es estático. Los datos estáticos, aunque se declaren dentro de una clase, son únicos y globales como cualquier estático. Se crean antes de que empiece el programa y existen hasta su terminación. Por eso son únicos y no dependen de la creación de objetos de estructura o clase. Son, a todos los efectos, datos estáticos globales a los que limitamos su visibilidad.

Importante: cosas que NO son objetos

Estas "entidades" no son objetos:

  • Un valor (value)
  • Una referencia (reference)
  • Una función (function)
  • Un enumerador (enumerator)
  • Un tipo (type)
  • Un miembro de clase no-estático (non-static class member)
  • Una plantilla (template)
  • Una clase (class)
  • Una especialización de plantilla de función (function template specialization)
  • Un espacio de nombres (namespace)
  • Un pack de parámetros (parameter pack)
  • La expresión this (this)

References

  1. Object en CPPReference
  2. sizeof en CPPReference.
  3. alignof en CPPReference
  4. storage duration en CPPReference
  5. lifetime en CPPReference
  6. type en CPPReference
  7. default-initialized en CPPReference
  8. declaration en CPPReference
  9. this en CPPReference
Última modificación: sábado, 24 de febrero de 2024, 13:00