syntaxe C++ que je ne comprends pas

syntaxe C++ que je ne comprends pas - C++ - Programmation

Marsh Posté le 05-01-2007 à 16:40:01    

Bonjour,
 
En lisant un tuto sur win32 et c++, je suis tombé sur une classe qui as une syntaxe dint je ne connais pas la signification  (je ne trouve rien dans mon bouquin c++ qui n'est pourtant pas très vieux, et je ne vois pas trop comment formuler la recherche sur google)
 
Voici la syntaxe qui me chagrine  :sweat:  
 

Code :
  1. class WinSimpleClass
  2. {
  3. public:
  4. WinSimpleClass (char const * name, HINSTANCE hInst)
  5.  : _name (name), _hInstance (hInst)
  6. {}
  7. WinSimpleClass (int resId, HINSTANCE hInst);
  8. char const * GetName () const { return _name.c_str (); }
  9. HINSTANCE GetInstance () const { return _hInstance; }
  10.     HWND GetRunningWindow ();
  11. protected:
  12. HINSTANCE _hInstance;
  13. std::string _name;
  14. };


 
En fiat c'est la partie en rouge que je ne comprends pas  
 
public:
 WinSimpleClass (char const * name, HINSTANCE hInst)
  : _name (name), _hInstance (hInst)
 
je deduit que  _name et _hinstance sont privées, puisqu'ils commence par un underscore, mais que viennent t'ils faire (précédés d'un : ) dans la signature de la fonction ?
 
Pour info, ca vient de la : http://www.relisoft.com/win32/generic.html
 
Merci pour vas réponses  

Reply

Marsh Posté le 05-01-2007 à 16:40:01   

Reply

Marsh Posté le 05-01-2007 à 16:42:35    

initialisation des membres.

Reply

Marsh Posté le 05-01-2007 à 16:49:35    

D'ailleurs, l'initialisation des membres d'une classe se fait dans l'ordre de leurs déclarations, comme cet exemple ne le laisse pas penser.

Reply

Marsh Posté le 05-01-2007 à 17:06:42    

carabin a écrit :

je deduit que  _name et _hinstance sont privées, puisqu'ils commence par un underscore


En l'occurrence, ils sont protected. Le fait qu'ils sont précédés d'un underscore n'y change rien -- et il vaut mieux éviter cette convention de nomage.

Message cité 1 fois
Message édité par ++fab le 05-01-2007 à 17:07:32
Reply

Marsh Posté le 05-01-2007 à 17:13:45    

donc ca revient au même que si on faisait :
_name = name;
 
C'est ca ?
 

++fab a écrit :

En l'occurrence, ils sont protected. Le fait qu'ils sont précédés d'un underscore n'y change rien --


Oui, ca je sais que ce n'est pas le underscore quiles rend protected, et que c'est juste un moyen de reperer. Mais pourquoi vaut-il mieux l'eviter ? Et est ce que c'est pareil pour la notation a la hongroise (h pour les handles, i pour int, etc .. ) ?
 
En tout cas, merci a tout les deux  

Reply

Marsh Posté le 05-01-2007 à 17:29:57    

carabin a écrit :

donc ca revient au même que si on faisait :
_name = name;
C'est ca ?

 

Avant de faire une affectation à un objet, celui ci doit avoir été construit au préalable.
Sans la liste d'initialisation, tu construit "_name" par défaut, puis tu luis affecte ensuite "name".
La liste d'initialisation permet de s'affranchir de la construction par défaut.

 
carabin a écrit :

Oui, ca je sais que ce n'est pas le underscore quiles rend protected, et que c'est juste un moyen de reperer. Mais pourquoi vaut-il mieux l'eviter ?


Parce que dans certains cas, ce sont des noms réservés à l'implémentation. Ici c'est légal, mais je serais toi, je l'éviterai.


Message édité par ++fab le 05-01-2007 à 18:01:02
Reply

Marsh Posté le 05-01-2007 à 17:38:15    

carabin a écrit :

donc ca revient au même que si on faisait :
_name = name;


pas tout à fait :
lorsque tu entres dans le corps du constructeur, tous tes membres ont été créés, ce qui signifie en particulier que pour les membres dont le type est une classe, un constructeur par défaut a été appelé si tu n'as pas explicitement fourni une initialisation.
 
Un exemple pour éclaircir ces explications confuses :

Code :
  1. class A;
  2. class B
  3. {
  4.   A membre;
  5.   B (A a)
  6.   {
  7.     membre = a;
  8.   }
  9. };
  10. class C
  11. {
  12.   A membre;
  13.   C (A a)
  14.   : membre (a)
  15.   { }
  16. };


 
lorsque tu construis un objet de type B, les opérations effectuées sont :

  • initialisation de 'membre' par appel du constructeur par défaut de A
  • recopie de 'a' dans 'membre'

Ici, tu fais donc un appel inutile au constructeur par défaut de A
 
lorsque tu construis un objet de type C, comme tu as précisé une initialisation pour 'membre', tu ne fais que l'opération voulue :

  • initialisation de 'membre' par appel du constructeur par recopie de A


voila, j'espère que c'est un peu clair...
 
[edit]  [:benou_grilled]  grillé...

Message cité 1 fois
Message édité par franceso le 05-01-2007 à 17:39:06

---------------
TriScale innov
Reply

Marsh Posté le 05-01-2007 à 18:05:26    

franceso a écrit :

[edit]  [:benou_grilled]  grillé...


On en a un peu marre de te manger grillé. Au bain marie, la prochaine fois stp :)

Reply

Marsh Posté le 05-01-2007 à 18:11:16    

++fab a écrit :

On en a un peu marre de te manger grillé. Au bain marie, la prochaine fois stp :)


c'est vrai que là, avec presque 10min de retard, je devais être vraiment carbonisé !
 
Promis, je ferais mieux la prochaine fois :sweat:


---------------
TriScale innov
Reply

Marsh Posté le 06-01-2007 à 00:16:38    

C'est très clair, merci pour vos explications. Et une fois que je sais qu'il s'agit d'une initialisation des membres, je sais au moins quoi taper dans Google comme recherche, ce qui m'as permis entre autre de trouver ceci http://ltiwww.epfl.ch/Cxx/c2_4.html#c2_4_2
Parce qu'avant, j'avis du mal a savoir quoi demander (???)
(Mieux, j'ai même trouvé dans mon bouquin en entrefilet de 3 lignes ou on y fait allusion)
 
J'aurais une autre question sur un point qui n'est pas très clair pour moi, si ca ne vous dérange pas.  
 
On a une classe A avec un membre static m. On déclare une classe B qui hérite de A, et donc normalement aussi de ce membre static.  
 
La question est est ce que c'est la même variable (c-a-d même emplacement mémoire) qui seras commun aux classes A et aux classes B, ou bien y a t'il un membre m commun a toutes les classes A et un autre communs a toutes les classes (B + A) ?
 
J'espère avoir été clair !

Reply

Marsh Posté le 06-01-2007 à 00:16:38   

Reply

Marsh Posté le 06-01-2007 à 01:38:51    

carabin a écrit :

donc ca revient au même que si on faisait :
_name = name;
 
C'est ca ?


si t'avais pas d'opérateur =, tu serais marron si ça avait cette signification.

Reply

Marsh Posté le 06-01-2007 à 16:03:14    

carabin a écrit :

On a une classe A avec un membre static m. On déclare une classe B qui hérite de A, et donc normalement aussi de ce membre static.  
 
La question est est ce que c'est la même variable (c-a-d même emplacement mémoire) qui seras commun aux classes A et aux classes B, ou bien y a t'il un membre m commun a toutes les classes A et un autre communs a toutes les classes (B + A) ?


 
Première solution. Comme tu le dis toi-même, B hérite du membre statique. Un objet de type B est un objet de type A, entre autres.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed