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)