Classes
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:
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 copiableUna clase trivialmente copiable es una clase que
Clase de diseño estándarUna clase de diseño estándar es una clase que
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 PODUna clase POD es una clase que
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 |