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