Classes
Une classe est un type défini par l'utilisateur.
Un type de classe est défini par un spécificateur de classe, qui apparaît dans la decl-specifier-seq de la déclaration syntaxe. Voir déclaration de classe pour la syntaxe du spécificateur de classe.
Une classe peut avoir les types de membres suivants :
Tous les membres sont définis en une seule fois dans la définition de la classe, ils ne peuvent pas être ajoutés à une classe déjà définie (contrairement aux membres des namespaces)
Un membre d'une classe
T
ne peut pas utiliser
T
comme nom si le membre est
- un membre de données statique,
- une fonction membre,
- un type membre,
- un modèle membre,
- un énumérateur d'une énumération (sauf si l'énumération est scopée) (depuis C++11) , ou
- un membre d'une union anonyme membre.
Cependant, un membre de données non statique peut utiliser le nom
T
tant qu'il n'y a pas de constructeurs déclarés par l'utilisateur.
Une classe avec au moins une fonction membre
virtual
déclarée ou héritée est dite
polymorphe
. Les objets de ce type sont des
objets polymorphes
et possèdent des informations de type à l'exécution stockées dans leur représentation, qui peuvent être interrogées avec
dynamic_cast
et
typeid
. Les fonctions membres virtuelles participent à la liaison dynamique.
Une classe avec au moins une fonction membre virtuelle pure déclarée ou héritée est une classe abstraite . Les objets de ce type ne peuvent pas être créés.
|
Une classe avec un constructeur constexpr est un LiteralType : les objets de ce type peuvent être manipulés par des fonctions constexpr au moment de la compilation. |
(depuis C++11) |
Table des matières |
Propriétés des classes
Classe trivialement copiableUne classe trivialement copiable est une classe qui
Classe à disposition standardUne classe à disposition standard est une classe qui
Une structure à disposition standard est une classe à disposition standard définie avec le mot-clé struct ou le mot-clé class . Une union à disposition standard est une classe à disposition standard définie avec le mot-clé union . |
(depuis C++11) |
Classe à durée de vie implicite
Une classe à durée de vie implicite est une classe qui
- est un agrégat dont le destructeur n'est pas déclaré par l'utilisateur (jusqu'à C++11) fourni par l'utilisateur (depuis C++11) , ou
- a au moins un constructeur éligible trivial et un destructeur trivial non supprimé.
Notes : la propriété de durée de vie implicite est clarifiée par le rapport de défaut P0593R6 .
Classe PODUne classe POD est une classe qui
Une structure POD est une classe POD non-union. Une union POD est une union qui est une classe POD. |
(dépréciée en C++20) |
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement correct |
|---|---|---|---|
| CWG 148 | C++98 |
Les classes POD ne pouvaient pas contenir de pointeurs vers des membres,
qui sont eux-mêmes des types POD (scalaires) |
restriction supprimée |
| CWG 383 | C++98 |
Les opérateurs d'assignation de copie ou les destructeurs pouvaient être
déclarés par l'utilisateur dans les classes POD s'ils ne sont pas définis |
non autorisé |
| CWG 1363 | C++11 |
une classe qui a à la fois des constructeurs par défaut triviaux et non triviaux
en même temps pouvait être triviale |
elle est non triviale |
| CWG 1496 | C++11 |
une classe qui n'a que des constructeurs qui
sont tous définis comme supprimés pouvait être triviale |
elle est non triviale |
| CWG 1672 | C++11 |
une classe pouvait être une classe à disposition standard
si elle a plusieurs classes de base vides |
ce n'est pas une classe à disposition standard |
| CWG 1734 | C++11 |
une classe trivialement copiable ne pouvait pas avoir de
constructeurs/opérateurs d'assignation de copie/déplacement non triviaux supprimés |
peut être triviale si supprimée |
| CWG 1813 | C++11 |
une classe n'était jamais une classe à disposition standard si elle a une
classe de base qui hérite d'un membre de données non statique |
elle peut être une classe à disposition standard |
| CWG 1881 | C++11 |
pour une classe à disposition standard et ses classes de base,
des champs de bits sans nom pourraient être déclarés dans une classe différente déclarant les membres de données |
tous les membres de données non statiques
et champs de bits doivent être d'abord déclarés dans la même classe |
| CWG 1909 | C++98 | un template de membre pouvait avoir le même nom que sa classe | interdit |
| CWG 2120 | C++11 |
la définition de M(X) pour déterminer une classe à disposition
standard ne considérait pas le cas d'une classe dont le premier membre est un tableau |
a traité ce cas dans
la définition de M(X) |
| CWG 2605 | C++98 | une classe à durée de vie implicite pouvait avoir un destructeur fourni par l'utilisateur | interdit |