struct en C et class en C++
Dans cette leçon, vous allez modéliser un compte bancaire avec struct en C et avec class en C++ pour voir la différence entre les deux approches.
Introduction
En C, struct regroupe des données liées, et les fonctions qui les traitent sont écrites à part. En C++, class réunit données et fonctions membres (member functions) dans un même type et peut cacher les données avec private pour protéger la cohérence de l'objet.
Points importants
- Définissez les conditions qui doivent toujours être vraies (invariants) avant d'écrire les opérations.
- Traitez les cas de structure vide, pleine et d'échec d'allocation mémoire.
- Évaluez ensemble la complexité et la gestion mémoire de chaque opération.
Exemples de code C et C++
#include <stdio.h>
typedef struct {
const char *owner;
double balance;
} Account;
void deposit(Account *account, double amount) {
if (amount > 0) {
account->balance += amount;
}
}
int main(void) {
Account account = {"Ada", 100.0};
deposit(&account, 25.0);
printf("%s: %.2f\n", account.owner, account.balance);
return 0;
}
Ada: 125.00
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
class Account {
std::string owner_;
double balance_;
public:
Account(std::string owner, double balance)
: owner_(std::move(owner)), balance_(balance) {}
void deposit(double amount) {
if (amount > 0) {
balance_ += amount;
}
}
void print() const {
std::cout << owner_ << ": " << std::fixed
<< std::setprecision(2) << balance_ << '\n';
}
};
int main() {
Account account("Ada", 100.0);
account.deposit(25.0);
account.print();
}
Ada: 125.00
Comparaison entre C et C++
Dans la version C, la fonction deposit reçoit un pointeur vers struct Account et n'ajoute le montant que s'il est positif, mais n'importe quel code peut modifier balance directement. Dans la version C++, balance_ est déclaré avant public:, il est donc private par défaut et ne change qu'au travers de méthodes valides comme deposit(), ce qui rend très difficile d'obtenir un état incorrect, comme un solde fixé au hasard.
Les données (struct) et les opérations sont séparées, et la mémoire est allouée et libérée à la main.
Les classes et les conteneurs protègent la cohérence des données et gèrent eux-mêmes leurs ressources.
Exercices d'approfondissement
Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.
- Ajoutez des tests pour l'état vide et pour le moment où la capacité maximale est atteinte.
- Écrivez la libération de la mémoire et vérifiez qu'il n'y a pas de fuite.
- Comparez la complexité avec celle du conteneur équivalent de la bibliothèque standard.
S'entraîner avec un défi
Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.
Tous les défis