Espacios de nombres
Variantes
Acciones

Clases

De cppreference.com
< cpp‎ | language
 
 
 
 

Una clase es un tipo definido por el usuario.

Un tipo clase se define por medio del especificador de clase, que aparece en sec-decl-especificadores de la sintaxis de declaración. Consulte la declaración de clase para conocer la sintaxis del especificador de clase.

Una clase puede tener los siguientes tipos de miembros:

1) miembros datos:
2) funciones miembro:
3) tipos anidados:
a) clases anidadas y enumeraciones definidas dentro de la definición de clase
b) alias de tipos existentes, definidos con typedef o declaraciones alias de tipo (desde C++11)
c) el nombre de la clase dentro de su propia definición actúa como un alias de tipo de miembro público de sí mismo para fines de búsqueda (excepto cuando se usa para nombrar al constructor): esto se conoce como nombre de clase inyectada
4) enumeradores de todas las enumeraciones sin ámbito definidas dentro de la clase , o introducidas mediante declaraciones using o declaraciones using de enumerado (desde C++20)
5) miembros plantilla (plantillas de variable , (desde C++14)plantillas de clase o función) pueden aparecer en el cuerpo de cualquier clase/estructura/unión no local.

Todos los miembros de definen a la vez en la definición de clase, no se pueden añadir a una clase ya definida (a diferencia de los miembros de los espacios de nombres).


Un miembro de una clase T no puede usar a T como su nombre si el miembro es

  • un miembro dato miembro estático,
  • una función miembro,
  • un tipo miembro,
  • una plantilla miembro,
  • un enumerador de una enumeración (a menos que la enumeración tenga ámbito) (desde C++11), o
  • un miembro de un miembro de una unión anónima.

Sin embargo, un miembro dato no estático puede usar el nombre T, siempre y cuando no existan constructores declarados por el usuario.

Una clase con al menos una función miembro virtual declarada o heredada es polimórfica. Los objetos de este tipo son objetos polimorfos y tienen información de tipo en tiempo de ejecución almacenado como parte de la representación del objeto, que se puede consultar con dynamic_cast y typeid. Las funciones miembro virtuales participan en la vinculación dinámica.

Una clase con al menos una función miembro virtual pura declarada o heredada es una clase abstracta. No se pueden crear objetos de este tipo.

Una clase con un constructor constexpr es un LiteralType: objetos de este tipo pueden manipularse mediante funciones constexpr en tiempo de compilación.

(desde C++11)

Contenido

[editar] Propiedades de las clases

Clase copiable trivialmente

Una clase copiable trivialmente es una clase que

Clase trivial

Una clase trivial es una clase que

Clase de diseño estándar

Una clase de diseño estándar es una clase que

  • no tiene miembros de datos no estáticos de tipo clase de diseño no estándar (o ‘’array’’ de dichos tipos) o referencia,
  • no tiene funciones virtuales ni clases base virtuales,
  • tiene el mismo control de acceso para todos lo miembros de datos no estáticos,
  • no tiene clases base de diseño no estándar,
  • sólo una clase en la jerarquía tiene miembros de datos no estáticos, e
  • Informalmente, ninguna de las clases base tiene el mismo tipo que el primer miembro de datos no estático. O, formalmente: dada la clase como S, no tiene ningún elemento del conjunto M(S) de tipos como clase base, donde M(X) para un tipo X se define como:
  • Si X es un tipo clase no unión sin miembros de datos no estáticos (que pueden ser heredados) , el conjunto M(X) está vacío.
  • Si X es un tipo clase no unión cuyo primer miembro de datos no estático tiene el tipo X0 (dicho miembro puede puede ser una unión anónima), el conjunto M(X) consta de X0 y los elementos de M(X0).
  • Si X es un tipo unión, el conjunto M(X) es la unión de todos los M(Ui) y el conjunto que contiene todos los Ui, donde cada Ui es el tipo del i-ésimo miembro de datos no estático de X.
  • Si X es un tipo ‘’array’’ con tipo de elementos Xe, el conjunto M(X) consta de Xe y los elementos de M(Xe).
  • Si X es de un tipo no clase ni ‘’array’’, el conjunto M(X) está vacío.

Una estructura de diseño estándar es una clase de diseño estándar definida con la palabra clave de clase struct o class. Una unión de diseño estándares una clase de diseño estándar definida con la palabra clave de clase union.

(desde C++11)

[editar] Clases con tiempo de vida implícito

Una clase con tiempo de vida implícito es una clase que

  • es un agregado cuyo destructor no es declarado por el usuario (hasta C++11)proporcionado por el usuario (desde C++11), o
  • tiene al menos un constructor trivial seleccionable y un destructor trivial no eliminado.

Nota: la propiedad tiempo de vida implícito se aclara en el informe de defectos P0593R6.

[editar] Clase POD (Plain Old Data)

Una clase POD es una clase que

  • es una agregado,
  • no tiene operador de asignación de copia declarado por el usuario,
  • no tiene destructor declarado por el usuario, y
  • no tiene miembros datos no estáticos de tipo clase no POD (o ‘’array’’ de dichos tipos) o referencia.
(hasta C++11)
  • es una clase trivial,
  • es una clase de diseño estándar, y
  • no tienen miembros datos no estáticos de tipo clase no POD (o ‘’array’’ de dichos tipos).
(desde C++11)

Una estructura POD es una clase POD no unión. Una unión POD es una unión que es una clase POD.

El uso de la propiedad POD está en desuso. Los códigos de usuario deben esperar o requerir la propiedad trivial o diseño estándar, o ambas.

(desde C++20)

[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
CWG 148 C++98 las clases POD no pueden contener punteros a miembros,
que en sí mismo son tipo POD (escalares)
eliminada restricción
CWG 383 C++98 Los operadores de asignación de copia o destructores podrían
ser declarados por el usuario en las clase POD si no están definidos
no premitido
CWG 1363 C++11 una clase que tiene constructores predeterminados triviales y no triviales
al mismo tiempo podía ser trivial
no es trivial
CWG 1496 C++11 una clase que solamente tiene constructores definidos
como eliminados podía ser trivial
no es trivial
CWG 1672 C++11 una clase podía se una clase de diseño estándar
si tiene varias clases base vacías
no es una clase de diseño estándar
CWG 1734 C++11 una clase trivialmente copiable no podía tener constructores/operadores de
asignación de copia/movimiento eliminados no triviales
puede ser trivial si está eliminado
CWG 1813 C++11 una clase nunca era una clase de diseño estándar si tiene
una clase base que hereda un miembro de datos no estático
puede ser una clase de diseño estándar
CWG 1881 C++11 para una clase de diseño estándar y sus clases base,
los campos de bits sin nombre pueden declarase en un clase
diferente que declare los miembros de datos
todos los miembros de datos no estáticos
y los campos de bits deben
declarase primero en la misma clase
CWG 1909 C++98 una plantilla de miembro podía tener el mismo nombre que su clase prohibido
CWG 2120 C++11 la definición de M(X) al determinar una clase de diseño
estándar no consideraba el caso de una clase
cuyo primer miembro es una array
se abordó este caso
en la definición de M(X)
CWG 2605 C++98 una clase de tiempo de vida implícito podía tener un destructor
proporcionado por el usuario
prohibido