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 :

"this" pour initialiser un attribut


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activit� : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Par d�faut "this" pour initialiser un attribut
    Bonjour � tous,
    J'ai fait un exemple pour comprendre l'utilit� de this dans une classe donn�e.
    D'apr�s une petite recherche, l'op�rateur '.' est utilis� pour les variables et l'op�rateur '->' est utilis� pour les pointeurs.
    Ce principe, est-il vrai pour les attributs de classe ?
    Lorsque, j'ai essay� d'appliquer �a au exemple ci-dessous, l'op�rateur '.' ne fonctionne pas pour affecter une valeur � un attribut de la 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
     
    class Exemple 
    {
     
     
    	private:
    	int  numero;
     
     	public:
    	Exemple ();
    	~Exemple ();
    	Exemple (int  numeroIn);
    };
     
    Exemple::Exemple(int  numeroIn)
    {
    this.numero= numeroIn; // ça marche pas, erreur : l'expression doit avoir un type classe
    this->numero= numeroIn; // ça marche pourtant que numero n'est pas un pointeur 
    }
    Merci.

  2. #2
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par d�faut
    Bonjour,

    this est un pointeur. On peut donc �crire this->variableMembre, mais pas this.variableMembre.

    Si un bout de code de la forme x->variableMembre compile, alors :
    • soit x est un pointeur et cette expression �quivaut � (*x).variableMembre ;
    • soit x est un objet dont la classe poss�de une fonction un peu sp�ciale qui s'appelle operator-> et cette expression �quivaut � x.operator->()->variableMembre. Comme la plupart des classes n'ont pas une telle fonction, tu peux oublier ce deuxi�me cas pour l'instant, mais tu en auras besoin plus tard, quand tu rencontreras des mod�les de classe comme std::unique_ptr.


    Si un bout de code de la forme x->fonctionMembre() compile, alors c'est pareil :
    • soit x est un pointeur et cette expression �quivaut � (*x).fonctionMembre() ;
    • soit x est un objet dont la classe poss�de une fonction qui s'appelle operator-> et cette expression �quivaut � x.operator->()->fonctionMembre().

  3. #3
    Membre actif
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activit� : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Par d�faut
    Bonjour,
    Merci pour toutes ces explications.
    C'est � dire que "this" est le pointeur et l'utilisation de "." ou "->" ne d�pend pas de variableMembre elle m�me (si pointeur ou non).
    Je sais que l'utilisation de this n'est pas obligatoire en C++, mais il est utilis� utilis� seulement dans les fonctionMembre afin de dire au compilateur qu'il s'agit de variableMembre de la classe elle m�me l� o� on fait appel?
    Merci.

  4. #4
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    this n'existe que dans les fonctions membres non static, il est alors un pointeur sur l'objet courant.

    Je vois 4 cas d'utilisation de this :
    - On peut �crire this->membre, si this-> est absent, le compilateur saura acc�der au membre. L'�crire sert donc plus au "lecteur" du code qu'au compilateur.
    - On peut aussi utiliser this tout seul quand on veut par exemple transmettre un param�tre pointant sur l'objet.
    - On peut aussi utiliser *this pour d�signer l'objet lui-m�me. Par exemple, on voit cela en valeur de retour pour certains op�rateurs.
    - Je reviens sur ma premi�re affirmation pour ajouter que dans des cas tr�s rares, la notation compl�te this->membre peut �tre n�cessaire (acc�s � des membres de base h�rit�s via template ou utilisation de pointeurs de fonction membres.)

  5. #5
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    Heu, moi j'ai l'impression qu'il y a un 5 cas d'utilisation, qui est largement utilis� que les 4 cas mentionn�s, ou je les ai mal compris.
    C'est le changement de l'ordre de r�solution de nom de Koenig :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    void toto(int monprecieux)
    {
    // int monprecieux = 42;
        this->monprecieux = monprecieux;
    }
    Le "this->" permet d'indiquer au compilateur qu'il doit chercher le "monprecieux" en tant qu'attribut/champ de l'objet et pas un argument ou une variable locale de nom "monprecieux" qui pourrait trainer dans le quoi de ce code.

    (� moins aussi que je m�lange trop C++ et C# )

  6. #6
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Oui mais ce cas n'est pas un bon exemple imo, parce qu'il ne faudrait jamais �crire un truc aussi hasardeux � la base quand renommer un param�tre ne change strictement rien et rel�ve du trivial.
    Tout comme m�langer && et ||, certains analyseurs ou compilateurs vont �mettre un warning ici.

    this sert juste � r�cup�rer l'instance en cours. Pour se passer soi-m�me en param�tre, ou retourner sa valeur (moins utile parce que l'appelant peut juste utiliser l'op�rateur & ou directement le pointeur.. mais c'est utilis� pour permettre les appels cha�n�s).
    L'�criture this-> ne sert qu'� r�soudre certains probl�mes (qu'un d�butant ne devrait pas rencontrer) dans des templates et je n'ai jamais vu de coding guidelines qui le recommandent, au contraire c'est plut�t d�courager voire prohib�.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    struct A {
      A* get() { return this; }
      A& do() { return *this; }
    };
    A a;
    assert(&a == a.get());
    a.do().do().do();
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Python 3.X] __setattr__ pour initialiser un attribut de classe
    Par marco_linux dans le forum G�n�ral Python
    R�ponses: 4
    Dernier message: 10/07/2017, 08h02

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