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 }
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!