bonjour,
quel est la différence entre?:
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int& f(int x){ return x+1; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int f(int x){ return x+1; }
merci








bonjour,
quel est la différence entre?:
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int& f(int x){ return x+1; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int f(int x){ return x+1; }
merci
La 1ere marche pas, la 2nd fonctionne mais je suppose qu'il faut argumenter.
La 2nd retourne un entier dont la valeur est le paramètre + 1. Rien à dire, cela marche et c'est OK (juste pas très utile mais je suppose que c'est pour l'exemple)
La 1ere retourne une référence (donc un pointeur) sur une variable temporaire x+1. Une fois que tu quittes ta fonction, cette valeur temporaire n'existe plus et donc ton pointeur pointe sur n'importe quoi. Quand on retourne une référence (c'est valable aussi pour un pointeur), il faut s'assurer de la durée de vie de la variable pointée.
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.








je suis désolé, mais chez moi la premiere fonctionne.
et ca renvoie 3 quand je fais:
std::cout<<f(2);
Salut,
La première version renvoie une référence (comme l'a dit ram_000), mais il faut savoir qu'une référence est... un alias de l'objet en question (et non un pointeur).
Mais la variable x est détruite lorsque l'on quitte la portée de la fonction car, lorsque tu transmet x en paramètre, tu crée en réalité une variable temporaire propre à la fonction et nommée x.
Or, les règles de portées font que cette variable est détruite lorsque l'on quitte la portée de la fonction.
Dés lors, la première version renvoie un alias de quelque chose qui devient - de facto - invalide, et tu te place donc dans une situation dans laquelle tu pars vers des comportements indéfinis.
La seconde version par contre renvoie une variable qui continue d'exister![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
sur mon compilateur, quand je compile ta fonction
J'obtiens
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int& f(int x){ return x+1; }
Donc je modifie un tout petit peu ton codeerror C2440: 'return'*: impossible de convertir de 'int' en 'int &'
et là j'obtiens
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int& f(int x){ int y = x+1; return y; }
Je passe outre ce warning et j'y vais:warning C4172: retourne l'adresse d'une variable locale ou temporaire
Cela affiche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int & var = f(4); std::cout<< "coucou" << std::endl; std::cout<<var << std::endl;
Ce qui est le signe que ta variable var pointe sur n'importe quoicoucou
274156232
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.








Pardon!!!!!!!!!!!
le programme que je compile est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int& f(int x){ x=x+1; return x; }








et pourquoi? je suis d'accord avec ram-000Je suis d'accord, c'est un alias au sens C++ du terme mais si on est curieux et qu'on regarde sous la robe (c'est pas beau de regarder sous les robes des filles ), c'est bien un pointeur.
C'est mieux mais c'est toujours le même problème.
Tu retourne un alias sur un objet qui n'existe plus à la fin de ta fonction puisque le paramètre est empilé sur la pile et dépilé/perdu lorsque tu quittes la fonction.
Image un truc genreJe sias, c'est pas beau de mélanger de C et du C++ mais j'ai pas mieux comme exemple rapide !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::cout << f(strlen("coucou"));
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
Partager