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 char &r='c' et char r='c'


Sujet :

C++

  1. #41
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    C'est de la "mémoire" interne au processeur, bien plus rapide que la ram. (t'as dis résumé... je résume xD)
    Mais lis plutôt un cours d'architecture système et de système d'exploitation .. (le Tanenbaum reste mon préféré :p).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  2. #42
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    deubelte,
    Tu te perds dans des détails qui n'apporteront rien à ta compréhension des adresses, des pointeurs et de la gestion mémoire. D'autant que des notions comme tas ou pile n'existent pas en C++ mais sont liées au fonctionnement des PC et de certaines plateformes. D'autres ont des stratégies de gestion mémoire différentes. Ce que tu arriveras à comprendre sera donc dépendant de la plateforme sur laquelle tu interviens et du compilateur que tu utilises. L'important est plus de comprendre comment est spécifiée la durée de vie d'une variable, comment intervient la gestion dynamique, qu'est-ce qu'un pointeur, pourquoi on s'en sert (puis comment), quels sont les risques liés et comment on y remédie, etc.

  3. #43
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Bonjour,
    j'ai une question concernant toujours les références. SI on considère cette classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class set_int{
     
      public: int *adval;
      int nmax;
      int nelem;
      public:  
    	  set_int(int=20);
    	  set_int (set_int const & ); 
    	  set_int  operator =(set_int &);
    	  ~set_int();
    };
     
    set_int  set_int::operator=(set_int &e){
    	{
    		if(this !=&e)
    		{ delete adval;
    		  this->adval=new int[nmax=e.nmax];
    		  this->nelem=e.nelem;
    		  int i;
    		  for(i=0;i<nelem;i++)
    			  this->adval[i]=e.adval[i];
    		} 
    		  return *this;
    	}
     
    }

    Quelle sera la différence la même classe, mais si la surcharge de l'opérateur = renvoie une référence:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    set_int & set_int::operator=(set_int &e){
    	{
    		if(this !=&e)
    		{ delete adval;
    		  this->adval=new int[nmax=e.nmax];
    		  this->nelem=e.nelem;
    		  int i;
    		  for(i=0;i<nelem;i++)
    			  this->adval[i]=e.adval[i];
    		} 
    		  return *this;
    	}
     
    }
    Par exemple, avec un essais de cette classe:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void  main(){
      set_int ens1,ens2,ens3;
      int i,n;
      for(i=0;i<20;i++){ 
    	ens1.ajoute(5);
    	ens3.ajoute(6);
      }
     for(i=0;i<20;i++){ 
    	ens2.ajoute(i);
      }
      ens1=ens2=ens3;
    }
    Je ne vois pas la différence.

    Il est d'ailleurs écrit dans le bouquin que je lis: "A priori seule la valeur du pointeur du premier opérande à besoin d'être transmise par référence, pour que= puisse le modifier: cette condition est obligatoirement remplie puisque notre opérateur est surdéfini comme fonction membre. Toutefois en pratique, on utilisera également la transmission par référence, à la fois pour le second opérande et pour la valeur de retour, de facon à etre plus efficace en temps"
    Ce qui fait qu'on aurait pu écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set_int  set_int::operator=(set_int e){
    	{....}
    Etant donné que seul this à besoin d'être passé par référence.
    Merci

  4. #44
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Disons que c'est surtout important pour d'autres opérateurs surchargés, notamment les opérateurs de décalages de bits surchargés en "insertion/extraction de flux" : L'opérateur surchargé prend en paramètre une référence vers le flux, et retourne cette même référence.

    PS: J'ai appris un truc, aujourd'hui: que type & uneRef = *unPointeur; compte comme un déréférencement de unPointeur.
    Ce qui donne la propriété: Dans un programme sans comportement indéfini, il ne peut y avoir de référence nulle.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #45
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    PS: J'ai appris un truc, aujourd'hui: que type & uneRef = *unPointeur; compte comme un déréférencement de unPointeur.
    Ce qui donne la propriété: Dans un programme sans comportement indéfini, il ne peut y avoir de référence nulle.
    Hééé non justement on a testé ça sur Visual Studio (voir plus avant dans le topic) et ça ne déréférence pas

    J'ai pas testé sur GGC mais je suppose que lui déréférence
    Find me on github

  6. #46
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pardon, compte logiquement, vu de la norme, comme un déréférencement du pointeur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #47
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pardon, compte logiquement, vu de la norme, comme un déréférencement du pointeur.
    Oui vu de la norme, et du coup, il semble que ce soit un point de la norme que VS ne respecte pas.
    Find me on github

  8. #48
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne crois pas que la norme oblige l'implémentation à physiquement déréférencer le pointeur. C'est juste qu'elle ne définit pas ce qui se passe si on essaie...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #49
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    En mêmte temps c'est un peu ce qu'on essaye de dire avec loic depuis deux pages :s...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  10. #50
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet, mais j'ai eu du mal à en voir la conclusion.

    Le fait important est surtout que la norme n'interdit pas à l'implémentation de déréférencer physiquement le pointeur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. différence entre char a[20]="str" et char *a="str"
    Par iBen68 dans le forum Débuter
    Réponses: 4
    Dernier message: 31/10/2009, 03h22
  2. différence entre int et char
    Par hassiba_45 dans le forum C++
    Réponses: 4
    Dernier message: 12/06/2008, 21h53
  3. [Free Pascal] Mini-tutoriel : Différence entre char et chr (auto-analyse de code)
    Par Clandestino dans le forum Free Pascal
    Réponses: 14
    Dernier message: 24/03/2007, 18h18

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