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 :

methode avec "const"


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair� Avatar de stracoma
    Homme Profil pro
    M�decin
    Inscrit en
    Ao�t 2013
    Messages
    413
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : Maroc

    Informations professionnelles :
    Activit� : M�decin

    Informations forums :
    Inscription : Ao�t 2013
    Messages : 413
    Par d�faut methode avec "const"
    Bonsoir � vous tous.
    ce mot "const" qu'on met � la fin d'une m�thode me taraude.peut �tre parce que je n'ai pas encore vu d'exemple o� il est d�cisif. Prenant ce code simple:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include <iostream>
     
    using namespace std;
    class Carre
    {
    private:
        double cote;
     
    public:
        Carre(double x):cote(x){}
        double surface() const//sans const : ne chage rien
        {
            return cote * cote;
        }
        void set_cote(double x)
        {
            cote=x;
        }
     
        double get_cote()
        {
            return cote;
        }
     
    };
    int main()
    {
        Carre carre1(25.0);
     
        cout << carre1.surface()<< endl;
        cout<<carre1.get_cote()<< endl;
        carre1.set_cote(30);
        cout<<carre1.surface()<<endl;
        cout<<carre1.get_cote()<<endl;
        return 0;
    }
    je ne trouve de diff�rence que si j'�cris la m�thode surface de cette mani�re:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    double surface() 
        {
            return cote *= cote;
        }
    Pouvez vous m��crire un petit code simple o� const fait la diff�rence. Merci

  2. #2
    Membre �clair�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par d�faut
    Salut,

    Le mot const � la fin d'une m�thode signifie que cette m�thode ne modifiera pas l'objet appelant. Il faut l'utiliser au maximum pour �viter qu'un objet ext�rieur puisse modifier des valeurs qui n'ont pas lieux d'�tre.

    Ton exemple est presque bon sauf pour la m�thode get_cote o� il faut que tu rajoutes le mot clef const � la fin de la m�thode.

  3. #3
    Invit�
    Invit�(e)
    Par d�faut
    Hello !

    Pour compl�ter ce qui a �t� dit plus haut, le mot const, associ� � une m�thode, indique au compilateur que la m�thode en question n'a aucunement le droit de modifier les attributs de l'objet qui l'appelle. Par exemple, si tu �cris :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    int surface(void) const;
    int MyCLass::surface(void) const
    {
        return length * width;
    }
    Cela voudrait dire que la fonction surface n'a pas le droit de modifier les attributs de la classe MyClass. On utilise ainsi le mot cl� const pour �crire ce qu'on appelle commun�ment (dans d'autres langages) les getters. Mais l'utilisation ne se limite pas � cela. Pour �viter des erreurs de programmation, tu peux aussi faire le choix d'indiquer le mot const � chaque fois que cela a un sens : c'est-�-dire � chaque fois qu'une m�thode d'une classe n'est pas sens�e en modifier les attributs. Sur ce, passes une bonne journ�e.

  4. #4
    Membre �clair� Avatar de stracoma
    Homme Profil pro
    M�decin
    Inscrit en
    Ao�t 2013
    Messages
    413
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : Maroc

    Informations professionnelles :
    Activit� : M�decin

    Informations forums :
    Inscription : Ao�t 2013
    Messages : 413
    Par d�faut
    Si j'ai bien compris, par prudence, si on veut pas modifier les arguments , on ajout le mot const m�me si la foncion n'est pas cens�e les modifier

  5. #5
    Invit�
    Invit�(e)
    Par d�faut
    Citation Envoy� par stracoma Voir le message
    Si j'ai bien compris, par prudence, si on veut pas modifier les arguments , on ajout le mot const m�me si la foncion n'est pas cens�e les modifier
    Lorqu'on ajoute le mot cl� const � une m�thode, le pointeur this (repr�sentant une instance de la classe � un instant t) se comporte, lors de l'appelle de la m�thode, comme un pointeur constant. Cela signifie que la dite m�thode ne pourra pas modifier les attributs de la classe dans laquelle elle est d�finie (� moins d'utiliser les mutables). De plus, si dans une classe t'as deux m�thodes qui portent la m�me signature mais qui diff�rent uniquement par la pr�sence de l'identificateur const, le compilateur choisit tout seul la bonne m�thode. Essayes le code suivant (j'ai mis des commentaires, n�h�sites pas � les lire) :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include <iostream>
    #include <stdlib.h>
     
    class Class {
        /* attributes */
     
        public:
            int attr1;
            int attr2;
            mutable int attr3_mutable;
     
        /* methods */
     
        public :
            Class() : attr1(0), attr2(0), attr3_mutable(0)
            {
            }
            ~Class() {}
     
            // Cette méthode ne peut pas changer l'état du pointeur this
            void updateAttributes(int a1, int a2) const
            {
                std::cout << "methode " << __func__ << " const" << std::endl;
     
                // décommentes ceci pour voir
                /*attr1 = a1;
                attr2 = a2;*/
     
                // un attribut mutable peut être cependant modifié
                attr3_mutable = 1;
            }
     
            void updateAttributes(int a1, int a2)
            {
                std::cout << "methode " << __func__ << std::endl;
     
                attr1 = a1;
                attr2 = a2;
                attr3_mutable = 1;
            }
    };
     
    int main()
    {
        std::cout << "On a deux objets : l'un declare const et l'autre non" << std::endl;
        std::cout << "Remarques que le methode appelee n'est pas toujours la meme" << std::endl;
        std::cout << "-----------------------------------------------------------\n" << std::endl;
     
        Class c1_notConst;
        c1_notConst.updateAttributes(0, 0);
     
        const Class c2_const;
        c2_const.updateAttributes(0, 0);
     
        return 0;
    }
    Bon courage et n'h�sites pas si t'as d'autres questions !
    Derni�re modification par Invit� ; 22/03/2015 � 19h57.

  6. #6
    Membre �m�rite
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    307
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 307
    Par d�faut
    Citation Envoy� par stracoma Voir le message
    Si j'ai bien compris, par prudence, si on veut pas modifier les arguments , on ajout le mot const m�me si la foncion n'est pas cens�e les modifier
    Cela sert aussi cot� appelant, c'est une information importante on ne change pas l'objet avec une m�thode "const". Ainsi si on appelle x fois une fonction membre const avec les memes arguments alors on obtiendra toujours le m�me r�sultat.

  7. #7
    Invit�
    Invit�(e)
    Par d�faut
    Citation Envoy� par renoo Voir le message
    [...] Ainsi si on appelle x fois une fonction membre const avec les memes arguments alors on obtiendra toujours le m�me r�sultat.
    A�e, j'ai bien peur que non. Exemple :

    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
    27
    28
    29
    class Class {
        /* attributes */
     
        public:
            mutable int x_mutable ;
     
        /* methods */
     
        public :
            Class() : x_mutable(0)
            {
            }
            ~Class() {}
     
            // Cette méthode ne peut pas changer l'état du pointeur this (sauf pour les attributs "mutable")
            int random(int n) const {
                x_mutable = n; // cette méthode, bien qu'étant déclarée const, peut modifier l'attribut x_mutable (c'est suffisant pour montrer qu'une méthode const peut permettre d'obtenir des résultats différents)
                return rand()%x_mutable ; // la méthode renvoie de plus un résultat aléatoire
            }
    };
     
    int main()
    {
        srand(time(NULL));
     
        Class c;
        std::cout << c.random(2) << std::endl;
        std::cout << c.random(2) << std::endl;
    }
    Derni�re modification par Invit� ; 22/03/2015 � 18h06.

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

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