Maison > développement back-end > C++ > le corps du texte

Pourquoi un constructeur privé par défaut empêche-t-il la création d'objets en C mais l'initialisation renforcée fonctionne-t-elle ?

Patricia Arquette
Libérer: 2024-11-12 20:39:02
original
763 Les gens l'ont consulté

Why Does a Private Default Constructor Prevent Object Creation in C   But Braced Initialization Works?

Quand un constructeur privé n'est-il pas un constructeur privé ?

En C, rendre un constructeur privé semble être un moyen simple d'empêcher la création d'objets en dehors de la classe. Cependant, un comportement inattendu se produit lorsqu'un constructeur par défaut est déclaré privé.

Considérez le code suivant :

class C {
    C() = default;
};

int main() {
    C c; // Error: Private constructor
    auto c2 = C(); // Error: Private constructor
}
Copier après la connexion

Étonnamment, ce code ne parvient pas à se compiler en raison du constructeur privé par défaut. Cependant, le code suivant :

class C {
    C() = default;
};

int main() {
    C c{}; // Compiles
    auto c2 = C{}; // Compiles
}
Copier après la connexion

compile avec succès.

La raison de ce comportement particulier réside dans le standard C. Selon 8.4.2/5 [dcl.fct.def.default], une fonction n'est pas fournie par l'utilisateur si elle est explicitement définie par défaut lors de sa première déclaration. Par conséquent, dans notre exemple initial, le constructeur par défaut n'est pas fourni par l'utilisateur.

Ce manque de constructeurs fournis par l'utilisateur fait de la classe C un agrégat selon 8.5.1/1 [dcl.init.aggr], qui :

  • N'a pas de constructeurs fournis par l'utilisateur
  • N'a pas de données membres non statiques privées ou protégées
  • N'a pas de classes de base
  • A pas de fonctions virtuelles

Pour les agrégats, la syntaxe entre accolades-init est considérée comme un appel de constructeur et non comme une déclaration, c'est pourquoi elle réussit dans ce dernier extrait de code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal