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

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 :

1) membres de données :
2) fonctions membres :
3) types imbriqués :
a) nested classes et enumerations définies dans la définition de la classe
b) alias de types existants, définis avec les déclarations typedef ou type alias (depuis C++11)
c) le nom de la classe dans sa propre définition agit comme un alias de type membre public de lui-même aux fins de recherche non qualifiée (sauf lorsqu'il est utilisé pour nommer un constructeur ) : ceci est connu sous le nom de injected-class-name
4) enumerators de toutes les énumérations non délimitées définies dans la classe , ou introduits par using-declarations ou using-enum-declarations (depuis C++20)
5) modèles membres ( modèles de variables, (depuis C++14) modèles de classe ou modèles de fonction) peuvent apparaître dans le corps de toute classe/structure/union non locale.

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 copiable

Une classe trivialement copiable est une classe qui

Classe triviale

Une classe triviale est une classe qui

(obsolète en C++26)

Classe à disposition standard

Une classe à disposition standard est une classe qui

  • n'a pas de membres de données non statiques de type classe non à disposition standard (ou tableau de tels types) ou référence,
  • n'a pas de fonctions virtuelles et pas de classes de base virtuelles ,
  • a le même contrôle d'accès pour tous les membres de données non statiques,
  • n'a pas de classes de base non à disposition standard,
  • une seule classe dans la hiérarchie a des membres de données non statiques, et
  • Informellement, aucune des classes de base n'a le même type que le premier membre de données non statique. Ou, formellement : étant donné la classe S, n'a aucun élément de l'ensemble M(S) de types comme classe de base, où M(X) pour un type X est défini comme :
  • Si X est un type classe non-union sans membres de données non statiques (éventuellement hérités), l'ensemble M(X) est vide.
  • Si X est un type classe non-union dont le premier membre de données non statique a le type X0 (où ledit membre peut être une union anonyme), l'ensemble M(X) consiste en X0 et les éléments de M(X0).
  • Si X est un type union, l'ensemble M(X) est l'union de tous les M(Ui) et l'ensemble contenant tous les Ui, où chaque Ui est le type du ième membre de données non statique de X.
  • Si X est un type tableau avec un type d'élément Xe, l'ensemble M(X) consiste en Xe et les éléments de M(Xe).
  • Si X est un type non-classe et non-tableau, l'ensemble M(X) est vide.

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 POD

Une classe POD est une classe qui

  • est une agrégation ,
  • n'a pas d'opérateur d'affectation copie déclaré par l'utilisateur,
  • n'a pas de destructeur déclaré par l'utilisateur, et
  • n'a pas de membres de données non statiques de type classe non-POD (ou tableau de tels types) ou référence.
(jusqu'à C++11)
  • est une classe triviale,
  • est une classe à disposition standard, et
  • n'a pas de membres de données non statiques de type classe non-POD (ou tableau de tels types).
(depuis C++11)

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