Maison >développement back-end >C++ >Pouvez-vous initialiser un tableau dans une liste d'initialisation de constructeur C ?

Pouvez-vous initialiser un tableau dans une liste d'initialisation de constructeur C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-16 12:41:03697parcourir

Can you initialize an array in a C   constructor initializer list?

Initialisation des membres du tableau dans les listes d'initialisation du constructeur

C offre la possibilité d'initialiser les membres de la classe à l'aide d'une liste d'initialisation de membres dans le constructeur. Cependant, l'initialisation d'un membre du tableau de cette manière peut rencontrer des erreurs de compilation.

L'extrait de code ci-dessous illustre la tentative d'initialisation d'un membre du tableau dans une liste d'initialisation de constructeur, mais ne parvient pas à compiler :

class C {
public:
  C() : arr({1,2,3}) { // doesn't compile }
  /*
  C() : arr{1,2,3} // doesn't compile either }
  */
private:
  int arr[3];
};

La raison de ce problème réside dans les restrictions d'initialisation des tableaux. Les tableaux ne peuvent être initialisés que via la syntaxe d'affectation ('='), comme le montre l'exemple suivant :

int arr[3] = {1,3,4};

Questions et réponses :

1 . Comment initialiser un tableau dans les listes d'initialisation de constructeur ?

Pour initialiser un tableau dans une liste d'initialisation de constructeur, il faut utiliser une structure qui contient le tableau comme variable membre :

struct ArrStruct {
  int arr[3];
  ArrStruct() : arr{1,2,3} { }
};

class C {
public:
  C() : arr_struct(ArrStruct()) { }
private:
  ArrStruct arr_struct;
};

Cette approche consiste à créer une structure distincte pour contenir le tableau, puis à initialiser la structure dans le constructeur.

2. Standard C 03 et initialisation des tableaux

La norme C 03 ne traite pas explicitement de l'initialisation des agrégats (y compris les tableaux) dans les listes d'initialisation des constructeurs. L'invalidité du code dans l'exemple d'origine provient de règles générales interdisant l'initialisation directe des agrégats via des listes d'initialisation.

3. Initialisation de la liste C 11

L'initialisation de la liste C 11 fournit une solution à ce problème. Cependant, la syntaxe de la question initiale est incorrecte. La syntaxe correcte est :

struct A {
  int foo[3];
  A() : foo{1, 2, 3} { }
};

L'utilisation d'accolades déclenche directement la fonctionnalité d'initialisation de liste de C 11.

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