IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Différence entre int et int&


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Différence entre int et int&
    Bonjour
    Il me semble qu'il y a aucune différence entre int et int&.
    Par exemple, ces deux fonctions sont identiques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void f(int o); 
    et
    void f(int&o);
    En gros, pour les types primaires, cela ne sert à rien de passer une variable par référence ou par valeur.
    (Donc autant ne faire passer que des int).
    Idem pour cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int f(void);
    int& f(void);
    Mais je ne me rappelle plus pourquoi.

    Merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    int et int& sont 2 types radicalement différents. Le premier est un entier, le second est une référence vers un entier. Le comportement n'est pas le même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    f(int&);
    int main()
    {
       int i=0;
       f(i);//ok
       f(3);// erreur
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    f(int );
    int main()
    {
       int i=0;
       f(i);//ok
       f(3);// ok
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    f(int&o)
    {
       ++o;
    }
    int main()
    {
       int i=0;
       f(i);//ok
       assert(1==i);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    f(int o)
    {
       ++o;
    }
    int main()
    {
       int i=0;
       f(i);//ok
       assert(0==i);
    }
    Quand à la valeur retour :
    int f(); retourne une valeur par copie
    int& f(); retourne une référence. L'objet a intérêt d'exister après le retour de la fonction et tant que la référence est liée. Sinon, undefined behaviour (dans ce cas, c'est souvent un plantage).

    Cette question indique la nécessité de se replonger dans les premiers cours pour débutant.

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    je me doute bien que si on a :

    int f(int&) et qu'on fait f(4), ca va planter.

    mais moi, je me restreint au cas où:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int f(int& a)
    {...
    }
    et


    sont, ils me semblent identiques, dans l'appel de la fonction f.

  4. #4
    screetch
    Invité(e)
    Par défaut
    bah non, comme 3darchi l'a pointé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    f(int o)
    {
       ++o;
    }
    int main()
    {
       int i=0;
       f(i);//ok
       assert(0==i);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    f(int&o)
    {
       ++o;
    }
    int main()
    {
       int i=0;
       f(i);//ok
       assert(1==i);
    }

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    oui, mais ce que je voulais dire, c'est que quand tu fais f(Obj o), tu appelles le constructeur par copie, ici, non: f(Obj &o) alors que pour un type primaire, f(int o) ou f(int &o) c'est la même chose, pas d'appel au constructeur par copie.

    Vous voyez?

  6. #6
    screetch
    Invité(e)
    Par défaut
    tout s'eclaire si tu dis const int& au lieu de int&pour un entier, non, ca ne change pas grand chose, souvent les compilateurs passent ca dans les registres si ils peuvent.
    Pour un type plus complexe effectivement, sans passer des références const, ca fait une copie, ce qui est chiant (vas y que je te copie une list ou un vector...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transformer (int année, int mois, int jour) en millisecondes
    Par Logic_613 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 24/04/2012, 11h08
  2. Différence entre ExitCode et int Maint()
    Par BenoitM dans le forum Débuter
    Réponses: 1
    Dernier message: 27/08/2009, 16h28
  3. [Validate] Différence entre Digits et Int
    Par dorian53 dans le forum Autres composants
    Réponses: 3
    Dernier message: 31/03/2009, 14h37
  4. Différence entre size_type et un int ?
    Par Bakura dans le forum C++
    Réponses: 4
    Dernier message: 20/05/2007, 20h40
  5. Différence entre String et Int
    Par Alchimist dans le forum Langage
    Réponses: 6
    Dernier message: 05/04/2006, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo