Rigueur du mot-clé const
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 8 sur 61.
Lors de l’écriture de fonctions qui agissent comme des méthodes, certaines devraient modifier l’objet (comme player_take_damage), tandis que d’autres devraient seulement lire les données sans rien modifier. Le mot-clé const vous permet d’imposer cette distinction au niveau du compilateur.
En marquant un paramètre pointeur comme const, vous garantissez que la fonction ne modifiera pas les données vers lesquelles il pointe. Si vous essayez accidentellement de modifier un membre, le compilateur produira une erreur :
typedef struct {
int x;
int y;
} Point;
// Cette fonction ne peut que LIRE le point
void point_print(const Point *self) {
printf("(%d, %d)\n", self->x, self->y);
// self->x = 10; // ERROR: impossible de modifier via un pointeur const
}
// Cette fonction peut MODIFIER le point
void point_move(Point *self, int dx, int dy) {
self->x += dx;
self->y += dy;
}
Le paramètre const Point *self indique au compilateur et aux autres programmeurs que point_print est une opération de « getter » ou en lecture seule. On appelle cela la correction const : utiliser const partout où une modification n’est pas nécessaire.
Cette pratique permet de détecter les bogues rapidement. Si vous écrivez une fonction d’affichage et modifiez accidentellement un champ, le compilateur vous arrête immédiatement au lieu de laisser le bogue s’infiltrer dans votre programme.
Défi
FacileConstruisons un module Temperature qui stocke une valeur de température et fournit à la fois des opérations en lecture seule et des opérations de modification. Cela vous aidera à vous entraîner à utiliser des pointeurs const pour distinguer clairement les fonctions qui se contentent de lire les données de celles qui les modifient.
Vous allez créer trois fichiers :
temperature.h: déclarer une structureTemperatureavec un seul membredouble celsius. Déclarer également trois fonctions :temp_display: prend un pointeurconstvers Temperature et affiche la température actuelle (lecture seule)temp_adjust: prend un pointeur standard vers Temperature et une valeur double, puis ajoute cette valeur à celsius (modification)temp_to_fahrenheit: prend un pointeurconstvers Temperature et renvoie la valeur convertie en Fahrenheit (lecture seule)
TEMPERATURE_H.temperature.c: implémenter les trois fonctions. La fonctiontemp_displaydoit afficher au formatCurrent: {celsius}C. La fonctiontemp_to_fahrenheitdoit renvoyercelsius * 9.0 / 5.0 + 32.0. N’oubliez pas que les fonctions utilisant des pointeursconstne peuvent pas modifier les données de la structure.main.c: créer une instance de Temperature, effectuer les opérations et afficher les résultats.
Vous recevrez deux entrées : la valeur initiale en degrés Celsius (sous forme de double) et la valeur d’ajustement (sous forme de double).
Dans votre fichier principal :
- Initialiser une instance de
Temperatureavec la valeur initiale en degrés Celsius - Appeler
temp_displaypour afficher la température de départ - Appeler
temp_adjustpour modifier la température selon la valeur d’ajustement - Appeler à nouveau
temp_displaypour afficher la température mise à jour - Afficher la conversion en Fahrenheit à l’aide de
temp_to_fahrenheit
Afficher les résultats dans ce format :
Current: {celsius}C
Current: {celsius}C
Fahrenheit: {fahrenheit}FUtiliser %.1f pour toutes les valeurs de température afin d’afficher une décimale.
Par exemple, avec une valeur initiale de 20.0 et un ajustement de 5.0, la sortie serait :
Current: 20.0C
Current: 25.0C
Fahrenheit: 77.0FEssayez vous-même
#include <stdio.h>
#include "temperature.h"
int main() {
double initial_celsius, adjustment;
scanf("%lf", &initial_celsius);
scanf("%lf", &adjustment);
// TODO: Créer une structure Temperature et l'initialiser avec initial_celsius
// TODO: Appeler temp_display pour afficher la température de départ
// TODO: Appeler temp_adjust pour modifier la température selon la valeur adjustment
// TODO: Appeler temp_display à nouveau pour afficher la température mise à jour
// TODO: Afficher la conversion en Fahrenheit en utilisant temp_to_fahrenheit
// Format : "Fahrenheit: %.1fF\n"
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne