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 :

explication sur le mot cl� "this" en c++


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2015
    Messages
    39
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : F�vrier 2015
    Messages : 39
    Par d�faut explication sur le mot cl� "this" en c++
    Bonjour,
    je travail sur un exercice de surcharge des op�rateurs en C++. Pour surcharger les op�rateurs "==" "!=" pour des vecteurs de trois dimensions dont la classe est d�finit comme suite:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    class vecteur3d
    { float x, y, z ;
    public :
    vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0)
    { x = c1 ; y = c2 ; z = c3 ;
    }
    } ;
    ils ont propos� la solution suivante:

    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
    class vecteur3d
    { float x, y, z ;
    public :
    vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0)
    { x = c1 ; y = c2 ; z = c3 ;
    }
    int operator == (vecteur3d) ;
    int operator != (vecteur3d) ;
    } ;
    int vecteur3d::operator == (vecteur3d v)
    { if ( (v.x == x) && (v.y == y) && (v.z ==z) ) return 1 ;
    else return 0 ;
    }
    int vecteur3d::operator != (vecteur3d v)
    { return ! ( (*this) == v ) ;
    }
    SVP je demande des explications sur le mot cl� "*this" repr�sente quoi exactement
    et merci

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    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 505
    Par d�faut
    http://en.cppreference.com/w/cpp/language/this
    this est un pointeur sur l'objet courant.
    *this est donc une r�f�rence sur l'objet courant.
    Toute m�thode non statique d'une instance d'objet dispose d'un param�tre implicite correspondant � l'objet courant.

    Quand vous �crivez : Vous passez � la m�thode "foo" de la classe de l'instance de x un param�tre "cach�" correspondant � un pointeur sur le "x" du code pr�c�dent.

    Avec votre op�rateur "!=" le code :
    "*this" sera �gale � une r�f�rence sur la variable "x" et "v" sera �gale � y.

    P.S.: faites attention aux signatures de vos op�rateurs, leurs param�tres devraient �tre pass� par r�f�rences constantes et pas par copie.

  3. #3
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    par d�finition, this est le pointeur vers l'objet sur lequel est appel�e la fonction membre.

    Si la fonction est une fonction membre constante de la classe/structure Bidule, alors this est un Bidule const*, sinon, c'est un Bidule*.
    Il y a plein de remarques � faire sur ce code.

    operator== devrait retourner un bool�en.
    Elle devrait aussi �tre une fonction libre (non membre) (impl�ment�e comme friend inline?)
    Edit: et comme dit Bacelar, les arguments devraient �tre des r�f�rences constantes.

    operator!= devrait retourner un bool�en.
    Elle aussi devrait �tre une fonction libre
    Elle pourrait appeler plus explicitement operator==.
    Edit: et comme dit Bacelar, les arguments devraient �tre des r�f�rences constantes.

    Le constructeur devrait appeler la liste d'initialisation, plutot que r�affecter les variables.
    A priori, il devrait y avoir deux constructeurs, sans arguments par d�faut. Cela empecherait la conversion automatique d'un entier en un vecteur3d, et empecherait les constructions partielles.

    Sans template, ca donnerait ceci: (3 pour 3D, d pour double)
    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
    class vecteur3d {
    private:
        double x, y, z;
    public :
        vecteur3d(): x(0), y(0), z(0) {}
        vecteur3d(double x, double y, double z): x(x), y(y), z(z) {}
     
        friend inline bool operator==(vecteur3d const& a, vecteur3d const& b) {
            return (a.x == b.x) && (a.y == b.y) && (a.z == b.z);
        }
     
     
        vecteur3d& operator+=(vecteur3d const& autre) {
            this->x += autre.x;
            y += autre.y;
            z += autre.z;
            return *this;
        }
    };
     
    inline bool operator!=(vecteur3d const& a, vecteur3d const& b) {return !(a==b);}
    vecteur3d operator+(vecteur3d a, vecteur3d const& a) {return a += b;}
    Dans ce code, l'op�rateur + appelle l'op�rateur += de a (qui est pris en copie!), avec b comme argument, exactement comme si on avait �crit a.operator+=(b);. Dans cet appel, this pointe sur a.
    Du coup, *this est a, et la fonction retourne bien une r�f�rence sur l'objet qui est modifi�.

Discussions similaires

  1. Explication sur le mot New
    Par tamtam64 dans le forum Macros et VBA Excel
    R�ponses: 3
    Dernier message: 29/06/2015, 09h30
  2. [final]demande d'explication sur ce mot-cl�
    Par Invit� dans le forum Langage
    R�ponses: 10
    Dernier message: 18/04/2006, 11h32

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