2011-09-19 6 views
1

Un point de projet n3290 §12.1 (Constructeurs) ¶5:constructeur par défaut par défaut? dans n3290 projet

Un constructeur par défaut implicitement déclarée est un membre de inline public sa catégorie. Un constructeur par défaut transféré pour la classe X est définie comme étant supprimé si:

  • X est une classe de type union qui a un élément de variante avec un constructeur par défaut non triviale,
  • toute non-statique un membre de données sans initialiseur d'initialisation est égal à type de référence,
  • tout membre de données non statique non variant du type const-qualifié (ou du tableau ) sans initialisation d'accolade ou égaliseur égal ne pas avoir unfourni par l'utilisateurconstructeur par défaut,
  • X est une union et tous ses membres variants sont de type (ou matrice de ceux-ci) const qualifié,
  • X est une classe non-union et tous les membres d'un membre d'un syndicat anonyme sont de type const qualifiés (ou matrice de ceux-ci),
  • toute classe de base virtuelle ou directe, ou un membre de données non statique sans entretoise ou égal-initialiseur, possède le type de classe M (ou matrice de ceux-ci) et soit M n'a pas de constructeur par défaut ou de résolution de surcharge (13.3) tel qu'appliqué à M constructeur par défaut les résultats de » dans une ambiguïté ou à une fonction qui est supprimé ou inaccessible depuis le constructeur par défaut en défaut, ou
  • toute classe de base virtuelle ou directe ou élément de données non-statique a un type avec un
    destructor que est supprimé ou inaccessible du constructeur par défaut en défaut

S'il vous plaît expliquer le constructeur par défaut en défaut avec un programme exemple.

Répondre

2

Je pense que this extrait de Wikipedia explique ceci:

Explicitement défaillantes et a supprimé les fonctions membres spéciales

En C++ 03, le compilateur fournit, pour les classes qui ne sont pas fournir eux-mêmes, un constructeur par défaut, un constructeur de copie, un opérateur d'affectation de copie (opérateur =), et un destructeur. Le programmeur peut remplacer ces valeurs par défaut en définissant des versions personnalisées. C++ définit également plusieurs opérateurs globaux (tels que operator = et operator new) qui fonctionnent sur toutes les classes, que le programmeur peut surcharger.

Cependant, il y a très peu de contrôle sur la création de ces valeurs par défaut. Faire une classe en soi non copiable, par exemple, exige de déclarer un constructeur de copie privée et la copie opérateur d'affectation et non les définir. Tenter d'utiliser ces fonctions est une violation de la règle de définition unique. Bien qu'un message de diagnostic ne soit pas requis, [5] cela entraîne généralement une erreur de lien.[Citation nécessaire]

Dans le cas du constructeur par défaut, le compilateur ne génère pas un constructeur par défaut si une classe est définie par les constructeurs. Ceci est utile dans de nombreux cas, mais il est également utile de pouvoir avoir les deux constructeurs spécialisés et la valeur par défaut généré par le compilateur.

11 C++ permettra au Défaillante et la suppression explicite de ces fonctions membres spéciales. Par exemple, le type suivant déclare explicitement qu'il utilise le constructeur par défaut:

Exemple de code:

struct SomeType 
{ 
    SomeType() = default; //The default constructor is explicitly stated. 
    SomeType(OtherType value); 
}; 

Puisque vous semblez être un fan Standerdese (Presque toutes vos questions rechercher explications sur les citations standard) cet article ici sur la façon dont le comité des normes arrive à définir les fonctions par défaut et supprimées devrait être une bonne lecture pour vous:

Defaulted and Deleted Functions

0

Une des fonctions membres spéciales est "par défaut" si elle est déclarée avec la syntaxe = default;. La ligne juste avant la première ligne que vous avez citée indique:

S'il n'y a pas de constructeur déclaré par l'utilisateur pour la classe X, un constructeur sans paramètre est implicitement déclaré comme étant par défaut (8.4).

Par conséquent, un constructeur par défaut « en défaut » est un constructeur par défaut (constructeur qui peut être appelé sans arguments) qui est déclarée avec = default. Cela peut être explicitement définie en utilisant la syntaxe = default ou implicitement défini, par la ligne ci-dessus.

Questions connexes