EN DIRECT en ligne connexion / inscription
Connexion

Surnom/Pseudo
Mot de Passe :

[ Vous avez perdu votre mot de pass ? | Devenir membre ]

×

le C++ et les constantes ? (const)

CowcotLand topic RSS feed Surveiller les réponses de ce sujet
Noxer2000 @
Ouvrier agricole
Ouvrier agricole

430pts

Inscrit le: 17 février 2015
Messages: 85

Navigateur : n.c.

Hors ligne
Message Posté le: 28 avril 2015 à 15:51  Lien permanent
Répondre en citant
Salut tout le monde ! Très content

J'ai encore pas mal avancé dans le C++ grâce a vous et a vos réponses très clair ^^
Mais je me retrouve une fois de plus stoppé sur mon chemin !
Je n'arrive pas très bien a comprendre le principe des CONSTANTES :s

Comme par exemple quand l'on veut faire un Constructeur de copie
****************************
Personnage(); // constructeur
Personnage(Personnage const& autre);
****************************
et le "&" aussi je sais que c'est pour faire une référence mais je ne vois pas encore très clair dans ce que ça veut dire don si il serais possible d'y répondre en même temps ce serais super sympa ! Très content

Sur ce, je vous laisse lire attentivement se sujet pour y répondre en espérant que ce que je vous demande est assez clair et bien dit ^^

a-tchao ! Très content
Voir le profil de l'utilisateur Envoyer un message privé
Taloken @
Céréalier
Céréalier

8229pts

Inscrit le: 22 octobre 2012
Age: 29
Messages: 5091
Localisation: Niort
Navigateur : Firefox

Hors ligne
Message Posté le: 28 avril 2015 à 16:00  Lien permanent
Répondre en citant
Le const permet d'éviter que la variable soit modifiée par la suite.

Le "&" devant un argument permet de signifier que lorsque tu passeras le Personnage au constructeur de copie, alors la copie pointera sur la même instance.



Ex 1:

// disons que ton constructeur prend le nom du personnage en paramètre
Personnage p1 = new Personnage("Truc")
// constructeur de copie : Personnage(Personnage const autre);
Personnage p2 = new Personnage(p1)

p2.setNom("Machin");
cout << p1.getNom();

---> "Truc"


Ex 2:

// disons que ton constructeur prend le nom du personnage en paramètre
Personnage p1 = new Personnage("Truc")
// constructeur de copie : Personnage(Personnage const& autre);
Personnage p2 = new Personnage(p1)

p2.setNom("Machin");
cout << p1.getNom();

---> "Machin"







A confirmer, ça fait un bail que j'ai pas touché une ligne de C ^^'


Représentant commercial amateur et bénévole DesignedByGG
Voir le profil de l'utilisateur Envoyer un message privé » Album Photos » Google Map
garzebuth @
Fermier
Fermier

6291pts

Inscrit le: 30 novembre 2011
Messages: 3667

Navigateur : n.c.

Hors ligne
Message Posté le: 28 avril 2015 à 16:51  Lien permanent
Répondre en citant
Je confirme que c'est pas tout à fait ça =°

En fait le passage par référence est à définir par opposition au passage par copie:
Si je définis ma fonction comme ça:
fonction(Maclasse monObjet)
à chaque fois que je vais appeler fonction, je vais lui passer une COPIE de l'objet,
alors que si je l'écrit comme ça:
fonction(Maclasse &monObjet)
je vais lui passer une REFERENCE de l'objet (tu passes à la fonction l'adresse de la case de l'objet, que tu utilises ensuite comme ton objet à ne pas confondre avec le spointeurs où tu passes une variable contenant l'adresse de l'objet): ça veut dire que l'objet ne sera pas copié et donc que les modifications éventuelles qu'on lui fait subir se retrouveront dans la fonction appelante.

Le truc c'est qu'en C++ on a souvent des gros objets, et donc l'opération de copie prend du temps, donc il est conseillé de passer ceux-ci par référence puisque ça ne coûte rien. Le soucis c'est qu'alors tu risques de modifier l'objet passé en paramètre sans faire exprès, d'où le const qui, comme l'a dit Taloken empèche toute modification (si tu essaie de modifier la variable tu auras une erreur de compil).
Donc en écrivant la fonction comme ça:
fonction(const Maclasse &monObjet) (ou encore fonction(Maclasse const& monObjet) les écritures sont équivalentes)
on a le beurre et l'argent du beurre: de la performance et de la sécurité c'est ce qu'on apelle une référence constante.

Pour en venir au constructeur de copie en l'occurence on a pas le choix:
Si tu définis ton constructeur comme ça
Maclasse(MaClasse aCopier)
tu passes par COPIE à ton constructeur de COPIE. Et pour passer par copie il faut appeler le constructeur de copie... tu vois où je veux en venir c'est un moyen rigolo de faire une boucle infinie mais c'est pas vraiment le but de la manoeuvre.

Le prototype classique pour les constructeur par copie utilise la référence constante:
Maclasse(const MaClasse &aCopier)
Ce a quoi fait référence Taloken est en fait un problème laissé au choix du développeur: les éventuels pointeurs présents dans la classe peuvent être gérés de deux façons différentes:
-soit on copie le contenu du pointeur présent dans aCopier dans un new
-soit on fait pointer vers le contenu pointé par le pointeur de aCopier (ça fait beaucoup de pointes)

Dans le premier cas les deux pointeurs sont indépendants, dans le second ils pointent la même case mémoire et quand on en modifie un on modifie aussi l'autre.

Edit: pavé cesar on dirait pas que je suis au taf^^
Voir le profil de l'utilisateur Envoyer un message privé
Sauter vers: 
Surveiller les réponses de ce sujet CowcotLand topic RSS feed  

Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum