Salut
j'ai un petit souci pour comprendre le code suivant :
que signifie X(int x) : x(x)
Merci pour vos suggestionsCode:
1
2
3
4
5
6
7
8 struct X : public Item { int x ; X(int x) : x(x) { } };
Version imprimable
Salut
j'ai un petit souci pour comprendre le code suivant :
que signifie X(int x) : x(x)
Merci pour vos suggestionsCode:
1
2
3
4
5
6
7
8 struct X : public Item { int x ; X(int x) : x(x) { } };
C'est la liste d'initialisations. Il me semble que c'est dans la FAQ, sinon un peu de recherche devrait te donner des milliers d'explications.
une liste d'initialisation ca veut dire que x = x j'ai du mal a comprendre et j'ai cherché mais avoir pil poil la meme declaration je peux continuer longtemps et le but c'est de comprendre comment ca marche et pas le resultat pour pouvoir le modifier
mettre le même nom de variable a un paramètre et a un attribut de la classe, c'est pas une habitude à prendre. :aie:Citation:
Envoyé par juls64
a la base c'est pas mon code mais je dois le reprendre et le faire evoluer malheureusement pas un commentaire et des trucs comme ca partout qui font que j'ai du mal à tout bien comprendre
ahlala, reprendre le code des autres, c'est jamais une partie de plaisir. je me souviens du jour ou j'ai failli avoir une crise cardiaque en tombant sur un switch/case de 5 ou 6 écrans, avec des labels et des gotos a l'intérieur. un grand moment de solitude...
bon courage!
Pour répondre à ta question :Citation:
Envoyé par juls64
signifie que X est le constructeur de ta classe X prenant un integer en paramètre et x(x) signifie que tu initialises ta variable membre x avec la valeur x passée en paramètre de ton constructeur.Code:X(int x) : x(x)
C'est l'"équivalent" de x=x sauf que x(x) signifie que tu initialises x avec le constructeur de recopie. Bon ici ça n'a aucun sens vu que ta variable membre est un littéral.
Oui, et je dirais même qu'appeler des variables x ou y ou test ... c'est pas fait pour la lisibilité de celui qui passe derrière :aie:Citation:
Envoyé par PierroElMito
Merci beaucoup ep31 pour ta reponse claire et precise j'avoue qu'a force de voir du code bizarre un peu partout je finis par ne plus pouvoir reflechir calmement
Salut,
Ma petite pierre à l'édifice:
Typiquement, une classe ou une structure ont des membres de types (potentiellement) différents...
Le but du constructeur n'est rien d'autre que d'initialiser toutes ces variables avec les valeurs qui lui ont été transmises pour, une fois que la mémoire a été allouée en suffisance.
Pour les valeurs "litérales" (les types réellement de base), ainsi que l'a fait remarquer ep31, il n'est pas forcément intéressant de faire appel aux listes d'initialisations, mais pour tous ces membres qui sont, eux-meme, des type définis par l'utilisateur (struct ou class), c'est tout de suite différent...
En effet, la première chose qui est faite lors de l'appel du constructeur (que ce soit par la déclaration d'une variable du type de ta structure, ou par l'appel à l'operateur new) c'est... d'appeler les constructeurs des membres :P
Alors, imaginons un petit instant un constructeur du genre de
et considérons, pour l'exemple, que type1, type2 et type3 soient des structures ou des classes que tu as créées toi meme, et que var1, var2 et var soient des membres de maclass du type concerné...Code:
1
2
3
4
5
6
7 maclass::maclass(const type1& t1, const type2& t2, const type3& t3) { var1=t1; var2=t2; var3=t3; }
Et là, les choses se corsent un tout petit peu...
D'abord, il faut que tes types 1, 2, et 3 aient des "constructeurs par défaut" (des constructeurs qui peuvent etre considérés comme ne prenant aucun parametre, quittes à ce que les parametres aient tous une valeur par défaut ;))
Et nous sommes donc face à deux solutions distinctes:
- Soit, type1, type2 et type3 ont un constructeur par défaut (ou un constructeur qui est considérable comme tel) et, cela revient à dire
Le résultat direct, c'est qu'on va passer, au mieu par l'opérateur d'affectation, au pire on fera aussi un crochet, pour faire bonne mesure, par le constructeur par copie :PCitation:
Merci, tu m'a créé mes variables var1, var2 et var3 avec les valeurs par défaut, mais je voudrais maintenant que tu fournissent les valeurs de t1 à var1, celles de t2 à var2 et celles de t3 à var3 (ben ouaip, c'est ca le but des trois instructions du constructeur :D)...
Comble de travail inutile, les valeurs par défaut des membres de var1, var2 et var3 seront redéfinies dans l'opérateur d'affectation, et, peut etre meme dans le constructeur par copie :P... Bref, on fait deux à trois fois le meme travail :P- Soit, et, là, c'est le compilateur qui sera pas d'accord, tu n'as pas de constructeur qui puisse etre considéré comme le constructeur par défaut...
Et, dans ce cas, la seule solution pour que le compilateur ne crie pas au scandale, c'est de fournir la liste d'initialisations qui lui permette d'appeler les constructeurs ad-hoc, et qui prendra la forme de
:DCode:
1
2
3
4
5 maclass::maclass(const type1& t1, const type2& t2, const type3& t3): var1(t1),var2(t2),var3(t3) { //plus rien à faire ici :D }