Clases
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:
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 trivialmenteUna clase copiable trivialmente es una clase que
Clase trivialUna clase trivial 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 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
|
(hasta C++11) |
|
(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 |