Programmation Orientée Objet en C++          4ème Partie: Fonctions              Fabio Hernandez            Fabio.Hernande...
Vue dEnsemble   Notions de base   Types, variables, opérateurs   Contrôle dexécution   Fonctions   Mémoire dynamique   Qua...
Table des Matières   Déclaration de la Fonction   Utilisation de la Fonction   Prototype de Fonction   Contrôle de Type   ...
Déclaration de la Fonction   Une fonction est une opération définie par le programmeur   Les opérandes sont les paramètres...
Utilisation de la Fonction   Toute fonction doit être déclarée avant son utilisation   #include <iostream> // C++ standard...
Prototype de Fonction   Une fonction ne peut être définie quune seule fois dans un   programme   Mais peut être utilisée a...
Prototype de Fonction (suite)   Associé à chaque module (fichier .cpp) il faut créer un fichier avec les   prototypes des ...
Prototype de Fonction (suite)   Nous créons le fichier util.prt (le nom na pas dimportance   pour le compilateur mais en a...
Contrôle de Type   C++ est un langage fortement typé   Le type de la valeur de retour et de chacun des arguments   dune fo...
Valeur de Retour   Peut être dun type fondamental (int, long,...), dun type dérivé (int*)   ou d un type défini par le pro...
Signature de Fonction   La liste des arguments de la fonction est connue comme la   signature de la fonction   Le nom et l...
Signature de Fonction (suite)   Lors de linvocation de la fonction, le compilateur choisit entre   les différentes possibi...
Signature de Fonction (suite)   Le type de la valeur de retour ne fait pas partie de la   signature           int min(shor...
Passage des Arguments   Les arguments des fonctions en C++ sont passés par valeur   Une copie de la valeur de chaque argum...
Passage des Arguments (suite)           extern increment(int i);           void main()           {              int counte...
Passage des Arguments (suite)   Le passage des arguments par valeur nest pas toujours   souhaitable         quand la fonct...
Passage des Arguments (suite)           extern increment(int* value);           void main()           {              int c...
Passage des Arguments (suite)   Deux façons de passer les arguments par référence (suite)         utilisation des référenc...
Tableau comme Argument   Les tableaux en C++ ne sont jamais passés par valeur   Un tableau est passé comme un pointeur à s...
Tableau comme Argument (suite)   Exemple           void printArray(int* array, int howmany)           {              cout ...
Tableau comme Argument (suite)   Exemple (suite)           void main()           {              const int MaxItems = 5;   ...
Tableau comme Argument (suite)   Exemple (suite)         La fonction printArray ne modifie pas le tableau passé en argumen...
Fonctions Inline   Parfois le temps dexécution dune fonction est petit   comparé au temps nécessaire pour appeler la fonct...
Fonctions Inline (suite)   Le compilateur génère le code équivalent à lexpansion de la   fonction, comme si lon avait écri...
Portée des Variables   Une définition de variable introduit un identificateur   Il ne peut être utilisé que dans une parti...
Portée des Variables (suite)   Une variable définie en dehors dune fonction ou dune classe,   (variable globale), est visi...
Portée des Variables (suite)   Exemple           int count;                     // global variable           void dummy() ...
Durée de Vie des Variables   Lors de lexécution du programme, chaque objet est créé   quand sa définition apparaît et est ...
Durée de Vie des Variables (suite)   A laide du mot clé static le programmeur peut définir une   variable locale de façon ...
Durée de Vie des Variables (suite)   Exemple (suite)           void main()           {              for (int i=0; i < 5; i...
Prochain SlideShare
Chargement dans…5
×

Partie 4: Fonctions - Programmation orientée objet en C++

1 726 vues

Publié le

Support material for a continued education course "Introduction to object oriented programming in C++".
In French.

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
1 726
Sur SlideShare
0
Issues des intégrations
0
Intégrations
2
Actions
Partages
0
Téléchargements
136
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Partie 4: Fonctions - Programmation orientée objet en C++

  1. 1. Programmation Orientée Objet en C++ 4ème Partie: Fonctions Fabio Hernandez Fabio.Hernandez@in2p3.fr
  2. 2. Vue dEnsemble Notions de base Types, variables, opérateurs Contrôle dexécution Fonctions Mémoire dynamique Qualité du logiciel Evolution du modèle objet Objets et classes Fonctions membres Classes génériques Héritage Polymorphisme Héritage multiple Entrée/sortiePOO en C++: Fonctions 108 © 1997-2003 Fabio HERNANDEZ
  3. 3. Table des Matières Déclaration de la Fonction Utilisation de la Fonction Prototype de Fonction Contrôle de Type Valeur de Retour Signature de Fonction Passage des Arguments Tableau comme Argument Fonctions Inline Portée des Variables Durée de Vie des VariablesPOO en C++: Fonctions 109 © 1997-2003 Fabio HERNANDEZ
  4. 4. Déclaration de la Fonction Une fonction est une opération définie par le programmeur Les opérandes sont les paramètres de la fonction Exemple type de la nom de la valeur de fonction liste des retour paramètres int min(int a, int b) { corps de la fonction return (a < b) ? a : b; }POO en C++: Fonctions 110 © 1997-2003 Fabio HERNANDEZ
  5. 5. Utilisation de la Fonction Toute fonction doit être déclarée avant son utilisation #include <iostream> // C++ standard I/O declarations extern int min(int a, int b); int main() { int value1; int value2; cout << "Enter two integers: " << endl; cin >> value1 >> value2; cout << "The minimun between: " << value1 << " and " << value2 << " is " << min(value1, value2) << endl; return 0; }POO en C++: Fonctions 111 © 1997-2003 Fabio HERNANDEZ
  6. 6. Prototype de Fonction Une fonction ne peut être définie quune seule fois dans un programme Mais peut être utilisée autant de fois que nécessaire Généralement, elle est définie dans un fichier .cpp avec dautres fonctions et utilisée dans des modules différents Le moyen de déclarer une fonction est le prototype extern int min(int a, int b); Lobjectif du prototype est dinformer le compilateur du type de la valeur de retour, du nombre de paramètres et du type de chacunPOO en C++: Fonctions 112 © 1997-2003 Fabio HERNANDEZ
  7. 7. Prototype de Fonction (suite) Associé à chaque module (fichier .cpp) il faut créer un fichier avec les prototypes des fonctions définies dans celui-ci Ce fichier de prototypes sera inclus via une instruction pré-processeur dans tous les autres modules qui utilisent une ou plusieurs de ces fonctions Exemple: supposons que dans le fichier util.cpp se trouvent les définitions des fonctions min et abs suivantes int min(int a, int b) { return (a < b) ? a : b; } int abs(int a) { return (a < 0) ? -a : a; }POO en C++: Fonctions 113 © 1997-2003 Fabio HERNANDEZ
  8. 8. Prototype de Fonction (suite) Nous créons le fichier util.prt (le nom na pas dimportance pour le compilateur mais en a pour le programmeur) avec les déclarations suivantes extern int min(int a, int b); extern int abs(int a); Ce fichier peut maintenant être inclus dans tout module (fichier .cpp) nécessitant une des fonctions définies dans util.cpp #include <iostream> #include "util.prt" int main() { cout << "The absolute value of -345 is: " << abs(-345) << endl; return 0; }POO en C++: Fonctions 114 © 1997-2003 Fabio HERNANDEZ
  9. 9. Contrôle de Type C++ est un langage fortement typé Le type de la valeur de retour et de chacun des arguments dune fonction sont contrôlés en compilation Sil y a des différences entre le type de la déclaration et le type des arguments utilisés dans linvocation de la fonction une conversion implicite est effectuée si possible (probablement avec warning) int i = min(234, 78.90); // conversion a int 78 autrement, une erreur est détectée et la compilation échoue int i = min(234, "a string"); // ERROR Le nombre darguments est aussi contrôléPOO en C++: Fonctions 115 © 1997-2003 Fabio HERNANDEZ
  10. 10. Valeur de Retour Peut être dun type fondamental (int, long,...), dun type dérivé (int*) ou d un type défini par le programmeur enum Color {Black, White}; Color getComplementaryColor(Color currentColor) { return (currentColor == Black) ? White : Black; } Le type void est utilisé pour signifier labsence de valeur de retour void printError(const char* message) { cerr << "ERROR: " << message << endl; } Linstruction return nest pas strictement nécessaire pour une fonction qui retourne voidPOO en C++: Fonctions 116 © 1997-2003 Fabio HERNANDEZ
  11. 11. Signature de Fonction La liste des arguments de la fonction est connue comme la signature de la fonction Le nom et la signature de la fonction identifient pleinement chaque fonction Exemple: float min(float a, float b) { return (a < b) ? a : b; } est différente de la fonction min vue précédemmentPOO en C++: Fonctions 117 © 1997-2003 Fabio HERNANDEZ
  12. 12. Signature de Fonction (suite) Lors de linvocation de la fonction, le compilateur choisit entre les différentes possibilités, selon le type des arguments extern float min(float a, float b); extern int min(int a, int b); void main() { const float f1 = 0.234; const float f2 = 34.90; const int i1 = 190; int intMin = min(i1, 250); // min(int, int) is called float floatMin = min(f1, f2); // min(float, float) is called }POO en C++: Fonctions 118 © 1997-2003 Fabio HERNANDEZ
  13. 13. Signature de Fonction (suite) Le type de la valeur de retour ne fait pas partie de la signature int min(short a, short b); short min(short a, short b); // ERROR: same name and signaturePOO en C++: Fonctions 119 © 1997-2003 Fabio HERNANDEZ
  14. 14. Passage des Arguments Les arguments des fonctions en C++ sont passés par valeur Une copie de la valeur de chaque argument est copiée dans la pile dexécution de la fonction Les modifications faites à ces valeurs affectent uniquement les copies et ne sont pas reflétées dans les arguments actuels Exemple: soit la fonction void increment(int value) { value += 1; }POO en C++: Fonctions 120 © 1997-2003 Fabio HERNANDEZ
  15. 15. Passage des Arguments (suite) extern increment(int i); void main() { int counter=100; cout << "Before increment, counter is = " << counter << endl; increment(counter); cout << "After increment, counter is = " << counter << endl; } produit Before increment, counter is = 100 After increment, counter is = 100POO en C++: Fonctions 121 © 1997-2003 Fabio HERNANDEZ
  16. 16. Passage des Arguments (suite) Le passage des arguments par valeur nest pas toujours souhaitable quand la fonction doit changer la valeur des arguments quand largument de la fonction est un objet de grande taille: le coût en temps et en mémoire de la copie serait très élevé Deux façons de passer les arguments par référence utilisation des pointeurs void increment(int* value) { *value += 1; } à linvocation, largument de la fonction est ladresse de lobjet et pas lobjet lui mêmePOO en C++: Fonctions 122 © 1997-2003 Fabio HERNANDEZ
  17. 17. Passage des Arguments (suite) extern increment(int* value); void main() { int counter=100; cout << "Before increment, counter is = " << counter << endl; increment(&counter); // pass the address of count cout << "After increment, counter is = " << counter << endl; } produit Before increment, counter is = 100 After increment, counter is = 101POO en C++: Fonctions 123 © 1997-2003 Fabio HERNANDEZ
  18. 18. Passage des Arguments (suite) Deux façons de passer les arguments par référence (suite) utilisation des références void increment(int& value) { value += 1; } void main() { int counter=100; cout << "Before increment, counter is = " << counter << endl; increment(counter); cout << "After increment, counter is = " << counter << endl; } produit Before increment, counter is = 100 After increment, counter is = 101POO en C++: Fonctions 124 © 1997-2003 Fabio HERNANDEZ
  19. 19. Tableau comme Argument Les tableaux en C++ ne sont jamais passés par valeur Un tableau est passé comme un pointeur à son premier élément (celui de la position zéro) Conséquences: tout changement fait à un tableau à lintérieur dune fonction est effectué au tableau lui même et pas à une copie la taille du tableau (le nombre de positions) ne fait pas partie du type: la fonction ne connaît donc pas cette taillePOO en C++: Fonctions 125 © 1997-2003 Fabio HERNANDEZ
  20. 20. Tableau comme Argument (suite) Exemple void printArray(int* array, int howmany) { cout << "["; for (int pos=0; pos < howmany; pos++) La taille du tableau cout << " " << array[pos]; est aussi un cout << " ]" << endl; paramètre } void incrementArray(int* array, int howmany) { for (int pos=0; pos < howmany; pos++) array[pos] += 100; }POO en C++: Fonctions 126 © 1997-2003 Fabio HERNANDEZ
  21. 21. Tableau comme Argument (suite) Exemple (suite) void main() { const int MaxItems = 5; int itemTable[MaxItems]={5, 10, 15, 20, 25}; cout << "Originally, itemTable is: "; printArray(itemTable, MaxItems); incrementArray(itemTable, MaxItems); cout << "After increment, itemTable is: "; printArray(itemTable, MaxItems); } produit Originally, itemTable is: [ 5 10 15 20 25 ] After increment, itemTable is: [ 105 110 115 120 125 ]POO en C++: Fonctions 127 © 1997-2003 Fabio HERNANDEZ
  22. 22. Tableau comme Argument (suite) Exemple (suite) La fonction printArray ne modifie pas le tableau passé en argument On devrait donc la définir de la façon suivante void printArray(const int* array, int howmany) { cout << "["; for (int pos=0; pos < howmany; pos++) cout << " " << array[pos]; cout << " ]" << endl; }POO en C++: Fonctions 128 © 1997-2003 Fabio HERNANDEZ
  23. 23. Fonctions Inline Parfois le temps dexécution dune fonction est petit comparé au temps nécessaire pour appeler la fonction Le mot clé inline informe le compilateur quun appel à cette fonction peut être remplacé par le corps de la fonction Exemple inline int max(int a, int b) { return (a < b) ? b : a; } void main() { int m = max(134, 876); }POO en C++: Fonctions 129 © 1997-2003 Fabio HERNANDEZ
  24. 24. Fonctions Inline (suite) Le compilateur génère le code équivalent à lexpansion de la fonction, comme si lon avait écrit void main() { int m = (134 < 876) ? 876 : 134; } Conséquences: programme plus rapide programme plus gros Les fonctions inline doivent être définies dans des fichiers dentête (.h) qui seront inclus dans des fichiers source (.cpp), pour que le compilateur puisse faire lexpansionPOO en C++: Fonctions 130 © 1997-2003 Fabio HERNANDEZ
  25. 25. Portée des Variables Une définition de variable introduit un identificateur Il ne peut être utilisé que dans une partie du source du programme (portée) Une variable définie à lintérieur dune fonction (variable locale) peut être utilisée à partir de sa définition jusquà la fin du bloc où la définition apparaît void swap(int& a, int& b) { int temp = a; // temp is a local variable a = b; b = temp; }POO en C++: Fonctions 131 © 1997-2003 Fabio HERNANDEZ
  26. 26. Portée des Variables (suite) Une variable définie en dehors dune fonction ou dune classe, (variable globale), est visible à partir de sa définition jusquà la fin du fichier source (.cpp) où sa définition apparaît Une variable peut être définie dans un bloc avec le même nom quun identificateur déjà existant: dans ce cas, cette variable cache la variable du bloc externe ou la variable globale qui porte le même nomPOO en C++: Fonctions 132 © 1997-2003 Fabio HERNANDEZ
  27. 27. Portée des Variables (suite) Exemple int count; // global variable void dummy() { int count; // local count, hides global count = 100; // modifies local count while (count > 0) { // do something --count; } } void increment() { count += 1; // modifies global count }POO en C++: Fonctions 133 © 1997-2003 Fabio HERNANDEZ
  28. 28. Durée de Vie des Variables Lors de lexécution du programme, chaque objet est créé quand sa définition apparaît et est détruit quand son identificateur sort de contexte En particulier, les variables locales sont créées (allocation de mémoire dans la pile dexécution) au moment de linvocation (activation) de la fonction Elles disparaissent quand la fonction finit son exécution Les variables(objets) globales sont créées et initialisées une seule fois et existent jusquà la fin de lexécution du programmePOO en C++: Fonctions 134 © 1997-2003 Fabio HERNANDEZ
  29. 29. Durée de Vie des Variables (suite) A laide du mot clé static le programmeur peut définir une variable locale de façon à ce quelle existe jusquà la fin du programme Ce type des variables sont initialisées une seule fois Exemple void dummy() { static int count=1; // created and initialized // only once int local=100; // created and initialized // at each call cout << " local = " << local << << " count = " << count << endl; ++count; }POO en C++: Fonctions 135 © 1997-2003 Fabio HERNANDEZ
  30. 30. Durée de Vie des Variables (suite) Exemple (suite) void main() { for (int i=0; i < 5; i++) dummy(); } produit local = 100 count = 1 local = 100 count = 2 local = 100 count = 3 local = 100 count = 4 local = 100 count = 5POO en C++: Fonctions 136 © 1997-2003 Fabio HERNANDEZ

×