Maison > Article > développement back-end > Erreur C++ : les membres de la classe doivent être initialisés dans la liste d'initialisation, comment y faire face ?
En programmation C++, s'il y a des variables membres dans la définition de classe qui ne sont pas initialisées dans la liste d'initialisation, le compilateur signalera une erreur "Les membres de la classe doivent être initialisés dans la liste d'initialisation." Cela signifie que lorsqu'un objet est créé, le constructeur de cette variable membre ne sera pas appelé et peut provoquer une instabilité dans le programme.
Ainsi, en C++, lors de la création des objets d'une classe, vous devez utiliser autant que possible la liste d'initialisation. Cet article présentera ce qu'est une liste d'initialisation et son utilisation, ainsi que comment résoudre l'erreur selon laquelle les membres de la classe ne sont pas initialisés dans la liste d'initialisation.
Qu'est-ce qu'une liste d'initialisation ?
En C++, les membres d'une classe peuvent être des types de données de base, des tableaux, des structures, des classes, etc. Lors de la définition de variables membres dans une classe, vous pouvez choisir de les initialiser dans le corps du constructeur ou d'utiliser une liste d'initialisation (Constructor Initialization List).
La liste d'initialisation est un en-tête de fonction du constructeur. Vous pouvez utiliser la liste d'initialisation pour initialiser les membres avant le constructeur. Il s'agit d'une série d'opérations d'initialisation séparées par des virgules après les deux points (:) avant le corps du constructeur. Dans la liste d'initialisation, plusieurs variables membres peuvent être initialisées en même temps, ou le constructeur par défaut peut être utilisé pour l'initialisation, évitant ainsi les erreurs causées par le fait que les membres de la classe ne sont pas initialisés dans la liste d'initialisation.
La syntaxe est la suivante :
class SomeClass { public: SomeClass(int a, int b, int c) : var1(a), var2(b), var3(c) { //构造函数体中的其它操作 } private: int var1; int var2; int var3; };
Dans cet exemple, SomeClass a trois variables membres : var1, var2, var3, qui seront initialisées avant le constructeur, et d'autres opérations dans le corps du constructeur seront effectuées après la liste d'initialisation.
Utilisation de la liste d'initialisation
S'il y a d'autres objets dans la classe en tant que membres de la classe, vous pouvez également utiliser la liste d'initialisation pour initialiser ces membres. Comme indiqué ci-dessous :
class Person { public: Person(int _age, int _id) : age(_age), id(_id), car("BMW", "blue") { } private: int age; int id; Car car; //Car 是一个类类型成员 };
Dans cet exemple, nous utilisons la liste d'initialisation pour initialiser les variables membres age, id et car. Parmi eux, car est une variable membre de la classe Person. C'est un objet de type Car et est déclaré avec "Car car". Lorsque nous créons un objet Person, nous devons également initialiser le membre car. Lorsque vous utilisez une liste d'initialisation, vous devez utiliser le constructeur de la classe Car pour initialiser l'objet.
Lorsque vous devez convertir un type en un autre type, vous pouvez utiliser la liste d'initialisation :
class A { public: A(int val) : a(val), b(val*1.2), c(val*1.5) {} private: int a; double b; float c; };
Dans cet exemple, une valeur de type int est utilisée pour l'initialisation. La conversion de type est également possible dans. listes.
Parfois, les variables membres d'une classe doivent être en lecture seule et ne peuvent être initialisées que lorsque l'objet est créé et ne peuvent pas être modifiées dans le corps du constructeur. Ceci peut être réalisé en utilisant une liste d'initialisation. Comme indiqué ci-dessous :
class B { public: B() : a(5), b(2), c(a*b) {} private: const int a; const int b; const int c; };
Dans cet exemple, les variables a, b et c sont toutes en lecture seule et elles doivent toutes être initialisées lors de la création de l'objet. Puisque c est le produit de a et b et que a et b sont tous deux en lecture seule, ils ne peuvent être utilisés que dans la liste d'initialisation et l'expression qui leur est affectée ne peut pas être modifiée dans le corps du constructeur.
Comment gérer l'erreur « Les membres du groupe doivent être initialisés dans la liste d'initialisation » ?
Si les membres de la classe ne sont pas initialisés dans la liste d'initialisation lors de la création d'un objet de la classe, le compilateur signalera une erreur "Les membres de la classe doivent être initialisés dans la liste d'initialisation". Afin d'éviter cette erreur, nous pouvons suivre les étapes suivantes :
Dans le compilateur, le message d'erreur indiquera quelles variables membres ne sont pas initialisées dans la liste d'initialisation. Nous pouvons suivre les invites pour trouver les variables membres correspondantes dans le code source, telles que :
class Test { public: Test() { int a = 0; std::string b; } };
Dans la classe Test, il y a deux variables membres a et b. Dans le constructeur de la classe, nous ne les avons pas initialisés dans la liste d'initialisation, c'est pourquoi l'erreur a été signalée.
Ajoutez des variables membres non initialisées à la liste d'initialisation du constructeur si nécessaire. Modifiez le code du constructeur en :
class Test { public: Test() : a(0), b("") {} private: int a; std::string b; };
Dans cet exemple, nous utilisons la liste d'initialisation pour initialiser les variables membres a et b, évitant ainsi l'erreur "les membres de la classe doivent être initialisés dans la liste d'initialisation".
Notes
En C++, l'utilisation d'une liste d'initialisation peut non seulement éviter les erreurs lorsque les membres de la classe ne sont pas initialisés dans la liste d'initialisation, mais également améliorer l'efficacité du programme. Si l'initialisation est requise dans le corps du constructeur, le constructeur du membre de classe peut être appelé plusieurs fois à la fin du constructeur, mais l'utilisation d'une liste d'initialisation ne l'appellera qu'une seule fois, améliorant ainsi l'efficacité du programme.
De plus, lorsque la variable membre est de type const, si elle n'est pas initialisée dans la liste d'initialisation, le compilateur signalera une erreur. Lorsque vous utilisez la liste d'initialisation, vous devez faire attention au type de variables membres et à leur méthode d'initialisation.
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!