Table of Contents

Les classes en C++

La déclaration d'une classe

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);    
};

Les membres d'une classe

Les éléments membres d'une classe peuvent être :

Accès aux éléments d'un objet

Nous faisons la distinction entre les éléments qui sont propres à un objet instance d'une classe. Ces éléments sont :

A l'exception

Et les autres composantes de l'objet qui sont communes à tous les instances d'une classes que sont :

Accès aux fonctions membres et aux champs propres à l'objet instance d'une classe

Pour pouvoir accéder aux champs et aux fonctions membres d'un objet à l'exception des champs et membres statiques de l'objet, nous utilisons :

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;
}

Accès aux autres éléments définis dans la classe

Pour accéder aux définitions de types présentes dans l'objets, nous référençons ces éléments en préfixant le nom de l'élément référencé par le nom de la classe suivit de ::.

Ainsi si nous considérons la classe des nombres complexes :

class Complex
{ 
public:
 
   class Polar {}; // Classe vide ne servant qu'à définir un 
                   // type additionnel pour identifier 
                   // une conversion polaire vers complexe.
private:
    double re;
    double im;
 
public:
    Complex(): re(0.0), im(0.0)         // Constructeur par défaut.
    {}
    Complex(const Complex& theSource):  // Constructeur de recopie
        re(theSource.re), im(theSource.im)
    {}
    Complex(double aFloat):             // Conversion
        re(aFloat), im(0.0)
    {}
    Complex(double theReal, double theImaginary)
        re(theReal), im(theImaginary)   // Constructeur spécialisé
    {}
    Complex(Polar, double theRho, double thePhi)
        re(theRho* cos(thePhi)), im(theRho* sin(thePhi))
    {}
};

Il est possible d'accéder à la classe Polar de Complex en préfixant Polar par Complex::Polar. Ainsi l'appel :

Complex::Polar polar;
Complex complexNumber(polar, 2.0, 0,52);

est parfaitement valide, même si habituellement, nous écrirons plutôt :

Complex complexNumber(Complex::Polar(), 2.0, 0,52);

et nous nous affranchirons ainsi de la valeur intermédiaire polar.

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.

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.
}
 

Fonction membres ''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 :

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.    
}   

Le pointeur this

Dans une fonction membre, le mot clé this désigne le pointeur faisant référence à l'instance de l'objet qui est à l'origine de l'appel de la méthode.

Disposer de la référence sur l'objet dans la méthode est principalement pour les usages suivant :

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 
};