Maison >développement back-end >C++ >Quelle est la différence entre '=default' et '{}' pour les constructeurs et destructeurs par défaut en C ?

Quelle est la différence entre '=default' et '{}' pour les constructeurs et destructeurs par défaut en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-07 04:47:10483parcourir

What's the Difference Between

Comprendre la différence entre "=default" et "{}" pour le constructeur et le destructeur par défaut

Alors que "=default" et "{ }" peut sembler interchangeable pour les constructeurs et les destructeurs par défaut, il existe des distinctions clés lorsque l'on considère les destructeurs non virtuels et constructeurs.

Destructeurs non virtuels

Lorsqu'il s'agit de destructeurs non virtuels, la syntaxe "=default" joue un rôle important. Il demande au compilateur de générer automatiquement le destructeur comme il le ferait pour les classes triviales, ce qui rend le type considéré comme trivial. D'un autre côté, "{}" crée un destructeur fourni par l'utilisateur, modifiant le statut de trivialité de la classe.

Constructeurs non virtuels

De même, pour les non-virtuels -constructeurs virtuels, en utilisant "=default" permet au compilateur de générer un constructeur par défaut, en conservant la trivialité. Cependant, "{}" spécifie un constructeur fourni par l'utilisateur, ce qui peut avoir un impact sur la trivialité de la classe.

Classes triviales

En C 11, une classe triviale est une classe qui ne Je n'ai aucune fonction membre spéciale fournie par l'utilisateur (constructeur par défaut, constructeurs/affectation de copie/déplacement, destructeurs). Ces fonctions sont générées automatiquement, permettant d'appliquer des optimisations comme memcpy.

Exemple

Considérez le code suivant :

struct Trivial
{
  int foo;
};

struct NotTrivial
{
  int foo;

  NotTrivial() {}
};

struct Trivial2
{
  int foo;

  Trivial2() = default;
};
  • Trivial est trivial car il n'a aucun membre spécial fourni par l'utilisateur fonctions.
  • NotTrivial n'est pas trivial car il a un constructeur par défaut fourni par l'utilisateur.
  • Trivial2 est trivial même s'il a un constructeur marqué comme "=default", car cela appelle toujours le compilateur constructeur par défaut génération.

Conclusion

Bien que "=default" et "{}" puissent sembler similaires, ils peuvent avoir des implications substantielles sur la trivialité des classes lorsqu'ils sont utilisés avec des destructeurs ou des constructeurs non virtuels. "=default" conserve le comportement par défaut du compilateur et préserve la trivialité, tandis que "{}" crée des fonctions fournies par l'utilisateur et modifie potentiellement le statut de trivialité de la classe.

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!

Déclaration:
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