User Tools

Site Tools


in204:cpp:syntax:class

This is an old revision of the document!


Introduction à la déclaration des classes

Une classe définissant un objet est défini comme une structure contenant en plus des champs de la structure des fonctions membres.

struct A 
{     
    unsigned fieldA;                 // définition des champs.
    float fieldB; 
 
    bool test();                     // prototype des fonctions membres 
    void execute(int anArgument);    
};

Définition des fonctions membres

La définition de la fonction peut contenir soit l'entête de la fonction membre suivi de son code :

#include <cmath>
 
struct Vector
{     
    double x;
    double y;
 
    double norm() 
    { 
        return sqrt(x*x + y*y);
    }
}

soit nous pouvons scinder la déclaration de la fonction membre en définissant au sein de la classe le prototype de la fonction membre. Le code de la fonction membre sera défini en dehors de la classe.

#include <cmath>
 
struct Vector
{     
    double x;
    double y;
 
    double norm();
}
 
double Vector::norm() 
{ 
    return sqrt(x*x + y*y);
}

Dans ce cas, il est possible de mettre la définition du code de la fonction dans un fichier “.h” ou “.hpp”

// Fichier Vector.hpp
#ifndef VectorHPP
#define VectorHPP
 
#include <cmath>
 
struct Vector
{     
    double x;
    double y;
 
    double norm();
};
#endif

et le code de la fonction membre dans le fichier “.cc” ou “.cpp”:

// Fichier Vector.cpp
 
#include "Vector.hpp"
 
double Vector::norm() 
{ 
    return sqrt(x*x + y*y);
}

Accéder aux champs et fonctions membres d'un objet

Pour accéder aux champs et aux fonctions d'un objet, nous utilisons :

  • soit l'opérateur .,
  • soit l'opérateur , si nous manipulons un pointeur sur un objet.

Ainsi considérons l'objet Vector précédemment défini, nous pouvons accéder aux champs de l'objet comme suit :

int main()
{
    Vector v;
    v.X = 4.3;
    v.Y = v.X + 1;
    std::cout << "La norme du vecteur ("
      << v.X << ", " << "v.Y" << ") est :" 
      << v.norm() << std:endl;
}

Si nous définissons un pointeur sur un objet de type Vector, l'accès se ferait par le biais de l'opérateur .

int main()
{
    Vector* v = new Vector();
    v->X = 4.3;
    v->Y = v->X + 1;
    std::cout << "La norme du vecteur ("
      << v->X << ", " << "v->Y" << ") est :" 
      << v->norm() << std:endl;
    delete v;
}

Différence entre ''class'' et ''struct''

En fait, les classes peuvent être définies soit en utilisant le mot-clé struct soit en utilisant le mot-clé class. Si on utilise le mot clé struct, cela signifie que par défaut les champs et fonctions membres (que l'on appelle aussi méthodes) sont visibles de tous (public) tandis qu'ils ne sont visibles que des fonctions membres de la classe si on utilise le mot clé class.

Ainsi, écrire :

struct A 
{     
    unsigned field;                 // définition des champs.
    bool test();                     // prototype des fonctions membres 
};

est équivalent à :

class A 
{    
public:
    unsigned field;                 // définition des champs.
    bool test();                     // prototype des fonctions membres 
};

Par analogie,

class B 
{    
    unsigned value;                  // définition des champs.
    bool execute(int);               // prototype des fonctions membres 
};

est équivalent à :

struct B 
{    
private:
    unsigned value;                  // définition des champs.
    bool execute(int);               // prototype des fonctions membres 
};

Sections ''private'', ''protected'' et ''public''

Les mots clés private, protected et public modifient la visibilité des différents éléments dans une classe. Pour plus d'informations, le chapitre détaille les différents niveaux d'accessibilité aux champs et membres notamment dans le cadre de l'héritage.

  • Un élément d'une classe est dit public s'il est accessible à la fois par les fonctions membres de la classe mais aussi par les autres fonctions (fonctions du programme ou fonctions membres d'une autre classe).
  • Un élément d'une classe est dit private s'il est accessible par les fonctions membres de la classe mais aussi par n'est pas visible par les autres fonctions (fonctions du programme ou fonctions membres d'une autre classe).
class Point
{
private:
    double x;               // les champs x et y sont déclarées privées
    double y;               // ils ne pourront qu'être accédés par les méthodes       
                            // internes de la classe.
public:
    int getX() { return x; }  // accède au champ x.             
    int getY() { return y; }  // accède au champ y.             
 
}

En conséquence :

int main()
{
    Point p;
 
    std::cout << "L'abcisse de p est " << p.getX() << std::endl;
        // L'accès à la méthode p est possible parce que la fonction membre
        // getX est publique.
 
    std::cout << "L'abcisse de p est " << p.x << std::endl;
        // L'accès au champ p est impossible parce que le champ
        // p n'est pas public.
}
 

Méthode ''const'' & objets modifiables

La classe Point précédemment définie introduit deux fonctions membres qui ne font que lire le contenu des champs x et y de l'objet. Ces méthodes ne modifiant par l'objet, il peut-être ajouter le qualificateur const à ces deux méthodes.

class Point
{
private:
    double x;               // les champs x et y sont déclarées privées
    double y;               // ils ne pourront qu'être accédés par les méthodes       
                            // internes de la classe.
public:
    int getX() const { return x; }  // accède au champ x. Cette méthode ne modifie             
                                    // pas l'objet   
    int getY() const { return y; }  // accède au champ y.Cette méthode ne modifie             
                                    // pas l'objet                                           
 
}

Mettre le qualification const à une méthode signifie que cette méthode ne peut pas modifier l'objet. Ceci a pour conséquence :

  • de n'accéder aux champs de l'objet qu'en lecture uniquement. La méthode ne peut pas affectée une nouvelle valeur à un champ.
  • de ne pouvoir qu'appeler des méthodes qui ont le qualificateur const, ie. qui garantissent ne pas modifier l'objet.

Ainsi le code suivant génère une erreur à la compilation :

struct Vector 
{
...
   double getX() const { return X; }
   double getY() const {return Y; }
   void setX(double aValue) const { X = aValue; }
           // Erreur de compilation, ne peut pas modifier x.
   void setY(double aValue) { Y = aValue; }
 
   void norm() const { return sqrt(X*X + Y*Y); }   
}

De même, il n'est pas possible d'appeler une méthode qui n'est pas marquée const si l'objet a été déclaré const.

int main()
{
    const Vector& vector = Vector();
    vector.setX(3.0);    // Erreur de compilation, vector n'est pas modifiable.    
}   
in204/cpp/syntax/class.1568640711.txt.gz · Last modified: 2019/09/16 13:31 by 147.250.35.104