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

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

Patricia Arquette
Libérer: 2024-11-16 12:41:03
original
609 Les gens l'ont consulté

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];
};
Copier après la connexion

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};
Copier après la connexion

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;
};
Copier après la connexion

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} { }
};
Copier après la connexion

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!

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