Programmer en C++
Les classes : Surdéfinition des fonctions membres

Principe d'une surdéfinition de fonction

Dans une même classe, on parle de surdéfinition lorsqu'une fonction se voit attribuer le nom d'une fonction déjà existante. Toutefois elle ne doit pas être une simple copie, il est nécessaire que les arguments de la fonction diffèrent par leur nombre. Par exemple :

Point();
Point(int);

sont des fonctions surdéfinies de la fonction Point(int, int);

L'intérêt de cette surdéfinition est immédiat : Il permet par exemple d'élargir les possibilités d'initialiser une instance. Pour mieux comprendre, définissons la premier de nos deux constructeurs surdéfinis :

Point::Point()
{
    x = 0;
    y = 0;
}

La création d'une instance sans fournir d'argument qui était refusé par notre constructeur Point(int, int); est maintenant accepté par ce nouveau constructeur. Les variables membres se retrouvent initialisée par défaut à zéro.
Le second constructeur pourrait être de la forme :

Point::Point(int abscisse)
{
    x = abscisse;
    y = abscisse;
}

L'argument unique fourni permet d'initialiser plus rapidement les deux variables membres avec la même valeur. Bien sur on aurait pu imaginer de transmettre la valeur uniquement à x, et d'imposer y = 0. Libre à chacun de faire d'autres choix.
Voyons maintenant un exemple complet :

#include <iostream>

using namespace std;

// Déclaration de la classe Point
class Point
{
private:
    int x;
    int y;
public:
    Point();               // Constructeur 1
    Point(int);           // Constructeur 2
    Point(int, int);     // Constructeur 3
    void afficher();
};

int main()
{
    Point a;         // Pas d'argument : pas de parenthèse !
    a.afficher();
    Point b(3);
    b.afficher();
    Point c(2, 7);
    c.afficher();
    return 0;
}

Point::Point()     // Constructeur 1
{
    x = 0;
    y = 0;
}

Point::Point(int abscisse)     // Constructeur 2
{
    x = abscisse;
    y = abscisse;
}

Point::Point(int abscisse, int ordonnee)     // Constructeur 3
{
    x = abscisse;
    y = ordonnee;
}

void Point::afficher()
{
    cout << "Les coordonnees du point sont (" << x << ", " << y << ")" << endl;
}

Attention à ne pas mettre de parenthèses au moment de déclarer le point "a" sans argument. Ce serait une erreur.
Observons maintenant ce qu'on obtient à l'exécution du programme :

Les coordonnees du point sont (0, 0)
Les coordonnees du point sont (3, 3)
Les coordonnees du point sont (2, 7)