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++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Points : 25
    Points
    25
    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
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    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
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Points : 25
    Points
    25
    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 éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Bousk Voir le message
    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é.
    Tu as tout à fait raison...

    Cependant, on m'a fait remarquer récemment que certains EDI, ou certains frameworks, encourageaient l'utilisation systématique de this, entre autres pour faciliter le travail d'intégration d'interfaces graphiques générées par un "designer" quelconque.

    Une preuve de plus que rien n'est jamais simple en ce bas monde, hein
    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

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Cependant, on m'a fait remarquer récemment que certains EDI, ou certains frameworks, encourageaient l'utilisation systématique de this, entre autres pour faciliter le travail d'intégration d'interfaces graphiques générées par un "designer" quelconque.
    j'aurais plutôt dit que ce sont les EDI qui font du PHP, qui lui force $this

+ 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