Maison >développement back-end >C++ >Pourquoi les classes C doivent-elles avoir un constructeur par défaut défini par l'utilisateur pour construire par défaut un objet « const » ?

Pourquoi les classes C doivent-elles avoir un constructeur par défaut défini par l'utilisateur pour construire par défaut un objet « const » ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-29 10:10:11611parcourir

Why Must C   Classes Have a User-Defined Default Constructor to Default-Construct a `const` Object?

Pourquoi C nécessite-t-il un constructeur par défaut fourni par l'utilisateur pour construire par défaut un objet const ?

La norme C exige que si un programme appelle l'initialisation par défaut d'un objet d'un type qualifié par const, le type de classe sous-jacent doit posséder un constructeur par défaut fourni par l'utilisateur. Cette exigence découle du fait que :

  • Les classes POD (Plain Old Data) n'ont pas d'initialisation par défaut : Si une classe POD n'est pas équipée d'un constructeur défini par l'utilisateur, elle est éligible pour être initialisé par défaut. Cependant, les objets POD dépourvus d'initialisation ne servent à rien, car leur état reste indéterminé.
  • Les objets Const nécessitent une initialisation immédiate : Contrairement aux objets POD, les objets const nécessitent une initialisation immédiate car leur état ne peut pas être modifié une fois établi. Si un objet const d'un type POD n'est pas initialisé, il devient inutile car sa valeur ne peut pas être modifiée.

Pour éviter ce dilemme, la norme stipule que les objets const ne peuvent pas être construits à partir de types POD dépourvus de un constructeur par défaut fourni par l'utilisateur. Cela garantit que les objets const sont toujours initialisés lors de la création.

Distinction entre les classes POD et non-POD

Pour clarifier, l'exigence de la norme s'applique spécifiquement aux objets const de non -Cours POD. Les classes POD, qui manquent de fonctions virtuelles ou de classes de base et dont les données membres sont elles-mêmes des POD, peuvent être initialisées par défaut même sans constructeur défini par l'utilisateur. En revanche, les classes non POD nécessitent un constructeur par défaut fourni par l'utilisateur pour activer l'initialisation par défaut.

Exemple illustratif

Considérez l'extrait de code suivant :

struct B {
  B(): x(42) {}
  int doSomeStuff() const { return x; }
  int x;
};

struct A {
  A() {} // Required by the standard
  B b; // Illustration purpose
};

int main() {
  const A a; // Valid due to user-provided default constructor in A.
}

Dans cet exemple, l'objet const 'a' de la structure A peut être construit par défaut car A a un constructeur par défaut fourni par l'utilisateur, qui satisfait aux exigences de la norme pour les classes non POD.

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