Namespaces
Variants

Classes

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Una clase es un tipo definido por el usuario.

Un tipo de clase se define mediante class-specifier, que aparece en decl-specifier-seq de la declaración sintaxis. Véase declaración de clase para la sintaxis del especificador de clase.

Una clase puede tener los siguientes tipos de miembros:

1) miembros de datos:
2) funciones miembro:
3) tipos anidados:
a) nested classes y enumerations definidas dentro de la definición de la clase
b) alias de tipos existentes, definidos con typedef o type alias (desde C++11) declaraciones
c) el nombre de la clase dentro de su propia definición actúa como un alias de tipo miembro público de sí misma para propósitos de búsqueda no calificada (excepto cuando se usa para nombrar un constructor ): esto se conoce como injected-class-name
4) enumerators de todas las enumeraciones no delimitadas definidas dentro de la clase , o introducidas por using-declarations o using-enum-declarations (desde C++20)
5) plantillas de miembros ( plantillas de variables, (desde C++14) plantillas de clase o plantillas de función) pueden aparecer en el cuerpo de cualquier clase/estructura/unión no local.

Todos los miembros se definen de una vez en la definición de la clase, no pueden agregarse a una clase ya definida (a diferencia de los miembros de los namespaces)

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

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

Sin embargo, un miembro de datos no estático puede usar el nombre T siempre que no haya 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 polimórficos y tienen información de tipo en tiempo de ejecución almacenada como parte de la representación del objeto, que puede consultarse con dynamic_cast y typeid . Las funciones miembro virtuales participan en el enlace dinámico.

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 : los objetos de este tipo pueden ser manipulados por funciones constexpr en tiempo de compilación.

(desde C++11)

Contenidos

Propiedades de las clases

Clase trivialmente copiable

Una clase trivialmente copiable es una clase que

Clase trivial

Una clase trivial es una clase que

(obsoleto en C++26)

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 no de diseño estándar (o arreglo de tales tipos) o referencia,
  • no tiene funciones virtuales y no tiene clases base virtuales ,
  • tiene el mismo control de acceso para todos los miembros de datos no estáticos,
  • no tiene clases base no de diseño estándar,
  • solo una clase en la jerarquía tiene miembros de datos no estáticos, y
  • 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 de clase no unión sin miembros de datos no estáticos (posiblemente heredados), el conjunto M(X) está vacío.
  • Si X es un tipo de clase no unión cuyo primer miembro de datos no estático tiene tipo X0 (donde dicho miembro puede ser una unión anónima), el conjunto M(X) consiste en 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 arreglo con tipo de elemento Xe, el conjunto M(X) consiste en Xe y los elementos de M(Xe).
  • Si X es un tipo no clase, no arreglo, 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 struct o la palabra clave class . Una unión de diseño estándar es una clase de diseño estándar definida con la palabra clave union .

(desde C++11)

Clase de duración implícita

Una clase de duración implícita 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 elegible trivial y un destructor trivial y no eliminado.

Notas: la propiedad de duración implícita se aclara mediante el informe de defectos P0593R6 .

Clase POD

Una clase POD es una clase que

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

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

(obsoleto en C++20)

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
CWG 148 C++98 Las clases POD no podían contener punteros a miembros,
que son ellos mismos tipos POD (escalares)
restricción eliminada
CWG 383 C++98 los operadores de asignación de copia o destructores podían ser
declarados por el usuario en clases POD si no estaban definidos
no permitido
CWG 1363 C++11 una clase que tiene tanto constructores por defecto triviales como no triviales
al mismo tiempo podría ser trivial
es no trivial
CWG 1496 C++11 una clase que solo tiene constructores que
están todos definidos como eliminados podría ser trivial
es no trivial
CWG 1672 C++11 una clase podría ser una clase de diseño estándar
si tiene múltiples clases base vacías
no es una clase de diseño estándar
CWG 1734 C++11 una clase trivialmente copiable no podría tener
constructores/operadores de asignación de copia/movimiento
no triviales eliminados
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 podrían declararse en una
clase diferente que declare los miembros de datos
todos los miembros de datos no estáticos
y campos de bits necesitan ser declarados
primero en la misma clase
CWG 1909 C++98 una plantilla de miembro podrí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 un array
abordado este caso en
la definición de M(X)
CWG 2605 C++98 una clase de duración implícita podría tener un destructor proporcionado por el usuario prohibido