Les fonctions en C++ : surcharge et paramètres par défaut.

Septembre 2016


Les fonctions en C++ : surcharge et paramètres par défaut.



En C++, une même fonction ou méthode de classe peut être surchargée, et avoir ce que l'on appelle des paramètres par défauts. Cette qualité est aussi valable pour les constructeurs de classes.

La surcharge de fonctions et méthodes de classes, dont le constructeur



Lorsqu'on surcharge une fonction, on la déclare deux ou plus de fois, en gardant le même nom, et
le même type de retour. Modifier le type de retour correspondrait alors au polymorphisme.

Exemple : Polygone.hpp

#include <iostream> 

using namespace std; 

class Polygone { 

public :  

Polygone(); 
Polygone(int nombreCote); 
Polygone(int nombreCote, bool regulier); 
Polygone(bool regulier); 

void setRegulier()  { cout << "Chouette ! Je suis regulier !" << endl; 
                      regulier = true; } 
                       
void setPolygone(int nbCote) { sonNombreCote = nbCote; } 

void setTaille(int tailleCote1) { cout << "Je connait la taille de mon premier coté : il mesure " << tailleCote1 << " cm." << endl; 
                                  saTailleCote1 = tailleCote1; } 
                                   
void setTaille(int tailleCote1, int tailleCote2)  
{ cout << "Je connait la taille de mon premier cote : il mesure " << tailleCote1 << " cm." << endl; 
  cout << "Je connait la taille de mon deuxieme cote : il mesure " << tailleCote2 << " cm." << endl; 

  saTailleCote1 = tailleCote1; 
  saTailleCote2 = tailleCote2; } 
                                                    
void setTaille(int tailleCote1, int tailleCote2, int tailleCote3)  
{ cout << "Je connait la taille de mon premier cote : il mesure " << tailleCote1 << " cm." << endl;                                                                 
  cout << "Je connait la taille de mon deuxieme cote : il mesure " << tailleCote2 << " cm." << endl; 
  cout << "Je connait la taille de mon troisieme cote : il mesure " << tailleCote3 << " cm." << endl; 

  saTailleCote1 = tailleCote1; 
  saTailleCote2 = tailleCote2; 
  saTailleCote3 = tailleCote3; } 

private : 

bool regulier; 
int sonNombreCote; 
int saTailleCote1; 
int saTailleCote2; 
int saTailleCote3; 

};


Cette exemple illustre la déclaration de la classe Polygone, qui utilise la surcharge du constructeur, et
de la fonction setTaille();

Voyons maintenant Polygone.cpp :

#include "polygone.hpp" 

using namespace std; 

Polygone::Polygone() { 

cout << endl << "Je suis un polygone, mais je ne sais pas si je suis regulier, ni combien j'ai de cotes, ni leur taille." << endl; 

} 

Polygone::Polygone(int nombreCote) { 

cout<< endl << "Je suis un polygone a " << nombreCote << " cotes mais je ne connait pas leur taille, et je ne sais pas si je suis regulier." << endl; 
sonNombreCote = nombreCote; 

} 

Polygone::Polygone(int nombreCote, bool regulier) { 

cout << endl << "Je suis un polygone a " << nombreCote << " cotes mais je ne connait pas leur taille."; 
if(regulier == true) 
     cout << " Je suis regulier !" << endl; 
else cout << " Je ne suis pas regulier." << endl; 
sonNombreCote = nombreCote; 
regulier = true; 

} 

Dans cet exemple, nous voyons l'implémentation de méthodes surchargées.
Cela se passe exactement de la même façon pour les fonctions non membres.

Vous pouvez tester ces deux fichiers avec ce fichier main.cpp :
#include "polygone.hpp" 
#include <iostream> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    cout << endl << "Polygone simple : "; 
    Polygone polygoneSimple; 
     
    cout << endl << "Polygone a trois cotes : "; 
    Polygone polygoneATroisCotes(3); 
     
    cout << endl << "Polygone a 7 cotes : "; 
    Polygone polygoneASeptCotesRegulier(7, true); 
     
    cout << endl << "Polygone simple : "; 
    polygoneSimple.setRegulier(); 
     
    cout << endl << "Polygone a trois cotes : " << endl; 
    polygoneATroisCotes.setTaille(5, 7, 1); 
     
    cout << endl << "Polygone a 7 cotes : " << endl; 
    polygoneASeptCotesRegulier.setTaille(1, 90); 
     
    cout << endl << endl; 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
}


Vous pouvez voir que le code est satisfaisant.

Utilisation des paramètres par défaut


Utiliser les paramètres par défauts peut s'avérer utile lorsque vous ne connaissez pas la valeur
de certains paramètres, alors qu'une fonction les attend.

Lors de la déclaration, les paramètres par défaut doivent se trouver au plus à droite.

exemple : redéfinition de la fonction setTaille :

void setTaille(int tailleCote1 = 5, int tailleCote2 = 8, int tailleCote3 = 4)  
{ cout << "Je connait la taille de mon premier cote : il mesure " << tailleCote1 << " cm." << endl;                                                                 
  cout << "Je connait la taille de mon deuxieme cote : il mesure " << tailleCote2 << " cm." << endl; 
  cout << "Je connait la taille de mon troisieme cote : il mesure " << tailleCote3 << " cm." << endl; 

  saTailleCote1 = tailleCote1; 
  saTailleCote2 = tailleCote2; 
  saTailleCote3 = tailleCote3; } 


Cela est d'une simplicité remarquable. Regardez maintenant l'utilisation avec main.cpp, lui aussi
changé pour plus d'utilité :

#include "polygone.hpp" 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    cout << endl << "Polygone simple : "; 
    Polygone polygoneSimple; 
     
    cout << endl << "Polygone a trois cotes : "; 
    Polygone polygoneATroisCotes(3); 
     
    cout << endl << "Polygone a 7 cotes : "; 
    Polygone polygoneASeptCotesRegulier(7, true); 
     
    cout << endl << "Polygone simple : "; 
    polygoneSimple.setTaille(); 
     
    cout << endl << "Polygone a trois cotes : " << endl; 
    polygoneATroisCotes.setTaille(1, 90); 
     
    cout << endl << "Polygone a 7 cotes : " << endl; 
    polygoneASeptCotesRegulier.setTaille(); 
     
    cout << endl << endl; 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
}


Vous pouvez tester ce code.

A voir également :

Ce document intitulé «  Les fonctions en C++ : surcharge et paramètres par défaut.  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.