Utiliser des prototypes de fonction dans les fichiers d'en-tête
Dans cette étape, vous découvrirez les prototypes de fonctions et comment utiliser les fichiers d'en-tête pour organiser et déclarer des fonctions en C++. Les prototypes de fonctions déclarent le nom, le type de retour et les paramètres d'une fonction sans fournir l'implémentation (le corps de la fonction). En utilisant des fichiers d'en-tête, vous séparez l'interface d'une fonction (sa déclaration) de son implémentation. Cette séparation améliore l'organisation du code, facilitant la maintenance et la réutilisation des fonctions dans plusieurs parties de votre programme ou dans plusieurs programmes.
Ouvrez le WebIDE et créez trois fichiers dans le répertoire ~/project :
Premièrement, créez math_functions.h :
touch ~/project/math_functions.h
Ajoutez le code suivant à math_functions.h :
#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_H
// Prototypes de fonctions pour les opérations mathématiques
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
double divide(double a, double b);
#endif // MATH_FUNCTIONS_H
Les fichiers .h sont utilisés pour les déclarations, contenant des prototypes de fonctions et d'autres déclarations mais pas les implémentations. De cette façon, vous pouvez déclarer des fonctions sans les implémenter. Les directives #ifndef, #define et #endif sont appelées gardes d'inclusion (include guards), et elles empêchent les inclusions multiples du fichier d'en-tête, ce qui peut causer des erreurs.
Ensuite, créez math_functions.cpp :
touch ~/project/math_functions.cpp
Ajoutez le code suivant à math_functions.cpp :
#include "math_functions.h"
// Implémentations des fonctions
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
double divide(double a, double b) {
// Vérification de la division par zéro
if (b == 0) {
return 0;
}
return a / b;
}
Ce fichier .cpp contient les implémentations réelles des fonctions qui ont été déclarées dans le fichier d'en-tête.
Enfin, créez main.cpp :
touch ~/project/main.cpp
Ajoutez le code suivant à main.cpp :
#include <iostream>
#include "math_functions.h"
int main() {
// Démonstration des appels de fonctions depuis le fichier d'en-tête
int x = 10, y = 5;
std::cout << "Addition: " << x << " + " << y << " = " << add(x, y) << std::endl;
std::cout << "Subtraction: " << x << " - " << y << " = " << subtract(x, y) << std::endl;
std::cout << "Multiplication: " << x << " * " << y << " = " << multiply(x, y) << std::endl;
std::cout << "Division: " << x << " / " << y << " = " << divide(x, y) << std::endl;
return 0;
}
Ce fichier main.cpp inclut le fichier d'en-tête math_functions.h, ce qui rend les prototypes de fonctions disponibles. Il peut ensuite utiliser les fonctions implémentées dans math_functions.cpp.
Compilez le programme en utilisant plusieurs fichiers source :
g++ math_functions.cpp main.cpp -o math_operations
./math_operations
Exemple de sortie :
Addition: 10 + 5 = 15
Subtraction: 10 - 5 = 5
Multiplication: 10 * 5 = 50
Division: 10 / 5 = 2
Créons un autre exemple avec un fichier d'en-tête plus complexe :
Créez calculator.h :
touch ~/project/calculator.h
Ajoutez le code suivant à calculator.h :
#ifndef CALCULATOR_H
#define CALCULATOR_H
class Calculator {
public:
// Prototypes de fonctions pour les opérations de calculatrice
int add(int a, int b);
int subtract(int a, int b);
int calculate(int a, int b, char operation);
};
#endif // CALCULATOR_H
Ce fichier d'en-tête déclare une classe nommée Calculator et ses méthodes publiques.
Créez calculator.cpp :
touch ~/project/calculator.cpp
Ajoutez le code suivant à calculator.cpp :
#include "calculator.h"
int Calculator::add(int a, int b) {
return a + b;
}
int Calculator::subtract(int a, int b) {
return a - b;
}
int Calculator::calculate(int a, int b, char operation) {
switch (operation) {
case '+': return add(a, b);
case '-': return subtract(a, b);
default: return 0;
}
}
Ce calculator.cpp fournit les implémentations des méthodes déclarées dans le fichier d'en-tête calculator.h.
Créez calculator_main.cpp :
touch ~/project/calculator_main.cpp
Ajoutez le code suivant à calculator_main.cpp :
#include <iostream>
#include "calculator.h"
int main() {
Calculator calc;
std::cout << "Calculator Operations:" << std::endl;
std::cout << "10 + 5 = " << calc.calculate(10, 5, '+') << std::endl;
std::cout << "10 - 5 = " << calc.calculate(10, 5, '-') << std::endl;
return 0;
}
Ce fichier principal utilise la classe Calculator et effectue des opérations.
Compilez le programme de calculatrice :
g++ calculator.cpp calculator_main.cpp -o calculator
./calculator
Exemple de sortie :
Calculator Operations:
10 + 5 = 15
10 - 5 = 5
Points clés concernant les prototypes de fonctions et les fichiers d'en-tête :
- Les fichiers d'en-tête (.h) déclarent les prototypes de fonctions, les classes et d'autres déclarations. Ils agissent comme une interface, décrivant quelles fonctions sont disponibles.
- Les fichiers source (.cpp) implémentent les fonctions réelles déclarées dans les fichiers d'en-tête. Ils contiennent le code expliquant le fonctionnement des fonctions.
#ifndef, #define et #endif (gardes d'inclusion) empêchent les inclusions multiples du même fichier d'en-tête, ce qui évite les erreurs de compilation potentielles.
- L'utilisation de fichiers d'en-tête favorise la modularité et la réutilisabilité du code.
- Les fichiers d'en-tête vous permettent de séparer le "quoi" (déclarations) du "comment" (implémentations).
- Ils facilitent l'organisation du code, le rendant plus facile à maintenir et à comprendre.
Vous pouvez considérer les fichiers d'en-tête comme le menu d'un restaurant. Le menu (en-tête) liste ce qui est disponible, tandis que la cuisine (fichier source) prépare les plats réels.