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

Pourquoi un constructeur privé par défaut peut-il être implicitement invoqué en C ?

Susan Sarandon
Libérer: 2024-11-12 04:30:02
original
954 Les gens l'ont consulté

Why Can a Private Default Constructor Be Implicitly Invoked in C  ?

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

En C , déclarer un constructeur par défaut privé peut sembler un moyen simple d'empêcher instanciation d'objet. Cependant, étonnamment, un constructeur privé par défaut peut toujours être invoqué implicitement.

Question :

Considérez le code suivant :

class C {
    C() = default;
};

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

Pourquoi le constructeur semble être privé mais peut être appelé implicitement avec une initialisation par accolade ?

Réponse :

La clé réside dans la spécification C 14. Un constructeur fourni par l'utilisateur est un constructeur qui est explicitement déclaré sans être défini par défaut ni supprimé. Étant donné que le constructeur par défaut de C a été explicitement défini par défaut lors de sa première déclaration, il n'est pas considéré comme fourni par l'utilisateur.

Par conséquent, C manque de constructeurs fournis par l'utilisateur et devient un agrégat, selon 8.5.1/1 du spécification. Un agrégat est défini comme une classe sans données membres non statiques privées ou protégées, sans classes de base, sans fonctions virtuelles et sans constructeurs fournis par l'utilisateur. Cela explique pourquoi l'initialisation des accolades peut créer avec succès des objets en C, même si le constructeur par défaut est techniquement privé.

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