Les structures en C++ et la différence avec les structures en C
Les structures utilisées en c/c++ pour définir un type défini par l'utilisateur, dans le dernier cours nous avons parlé des structures en c, et dans ce cours, nous discuterons des structures en c++ et la différence entre les deux.
En C++, structures (struct) et classes (class) sont exactement les mêmes choses, sauf que struct a par défaut la visibilité publique et class par défaut la visibilité privée. La sécurité est donc la chose la plus importante pour les structures et les classes. Une structure n'est pas sûre car elle ne peut pas cacher ses détails d'implémentation à l'utilisateur final, alors qu'une classe est sûre car elle peut cacher ses détails de programmation et de conception.
Pour voir la syntaxe de base des structures, cliquez ici
Quelques différences importantes entre les structures C et C++ :
Utilisation du mot-clé struct
En C, nous devons utiliser struct pour déclarer une variable struct. En C++, struct n'est pas nécessaire. pour déclarer une variable de structure en C, il faut utiliser "struct nom_structure". En C++, nous n'avons pas besoin d'utiliser struct, et l'utilisation de "nom_structure" fonctionnerait uniquement.
#include <stdio.h> struct etudiant { int age; // initialisation des données }; // programme principal int main() { struct etudiant et; // ... return 0; }
#include using namespace std; struct etudiant { int age; // initialisation des données }; // programme principal int main() { etudiant et; // .... return 0; }
Fonctions membres à l'intérieur de la structure
Les structures en C ne peuvent pas contenir de fonctions membres, mais les structures en C++ peuvent avoir des fonctions membres et des données membres.
#include <stdio.h> struct etudiant { int age; void setAge(int v) // fonction membre pour modifier l'age { age = v; } int getAge() // fonction pour retourner l'age { return age } }; // programme principal int main() { struct etudiant et1; et1.setAge(15); // Modifier l'age par 15 printf("%d", et1.getNote()); // afficher l'age de l'étudiant }
#include <iostream> using namespace std; struct etudiant { int age; void setAge(int v) // fonction membre pour modifier l'age { age = v; } int getAge() // fonction pour retourner l'age { return age; } }; // programme principal int main() { struct etudiant et1; et1.setAge(15); // Modifier l'age par 15 cout << "Note : " << et1.getAge(); // afficher l'age de l'étudiant }
Lorsque les programmes ci-dessus s'exécutent, le programme c génère l'erreur ci-dessous, mais c++ fonctionne parfaitement
p1.c:5:5: error: expected ':', ',', ';', '}' or '__attribute__' before '{' token { ^ p1.c: In function 'main': p1.c:17:8: error: 'struct etudiant' has no member named 'setAge' et1.setAge(15); // Modifier l'age par 15 ^ p1.c:18:21: error: 'struct etudiant' has no member named 'getNote' printf("%d", et1.getNote()); // afficher l'age de l'étudiant
Initialisation des données
Nous ne pouvons pas initialiser directement les données membres d'une structure en C mais nous pouvons le faire en C++.
#include <stdio.h> struct etudiant { int age = 15; // initialisation des données }; // programme principal int main() { struct etudiant et; printf("%d", et.age); return 0; }
#include <iostream> using namespace std; struct etudiant { int age = 15; // initialisation des données }; // programme principal int main() { etudiant et; cout << et.age << endl; return 0; }
Lorsque les programmes ci-dessus s'exécutent, le programme c génère l'erreur ci-dessous, mais c++ fonctionne parfaitement
p1.c:4:13: error: expected ':', ',', ';', '}' or '__attribute__' before '=' token int age = 15; // initialisation des données ^ p1.c: In function 'main': p1.c:11:20: error: 'struct etudiant' has no member named 'age' printf("%d", et.age); ^
Création de constructeur dans la structure
Les structures en C ne peuvent pas avoir de constructeur à l'intérieur, mais les structures en C++ peuvent avoir un constructeur comme dans la classe.
#include <stdio.h> struct etudiant { int age; etudiant(int val) { age = val; } }; // programme principal int main() { struct etudiant et(15); printf("%d", et.age); return 0; }
#include <iostream> using namespace std; struct etudiant { int age; etudiant(int val) { age = val; } }; // programme principal int main() { etudiant et(15); // création et initialisation avec l'appel du contructeur cout < et.age < endl; return 0; }
p1.c:5:5: error: expected specifier-qualifier-list before 'etudiant' etudiant(int val) ^~~~~~~~ p1.c: In function 'main': p1.c:13:24: error: expected declaration specifiers or '...' before numeric constant struct etudiant et(15); ^~ p1.c:14:18: error: 'et' undeclared (first use in this function); did you mean 'getw'? printf("%d", et.age); ^~ getw p1.c:14:18: note: each undeclared identifier is reported only once for each function it appears in
Membres statiques
Les structures C ne peuvent pas avoir de membres statiques mais sont autorisées en C++.
#include <stdio.h> struct etudiant { int age; static int code; }; // programme principal int main() { return 0; }
#include <iostream> using namespace std; struct etudiant { int age; static int code; }; // programme principal int main() { return 0; }
Cela générera une erreur en C mais fonctionnera parfaitement en C++.
p1.c:5:5: error: expected specifier-qualifier-list before 'static' static int code; ^~~~~~
Modificateurs d'accès
Les structures C n'ont pas de modificateurs d'accès car ces modificateurs ne sont pas pris en charge par le langage. Les structures C++ peuvent avoir ce concept car il est intégré au langage.
#include <stdio.h> struct etudiant { private : int age; public: int code; }; // programme principal int main() { return 0; }
#include <iostream> using namespace std; struct etudiant { private : int age; public: int code; }; // programme principal int main() { return 0; }
Lorsque les programmes ci-dessus s'exécutent, le programme c génère l'erreur ci-dessous, mais c++ fonctionne parfaitement
p1.c:4:5: error: expected specifier-qualifier-list before 'private' private : ^~~~~~~