====== Déclaration des structures ======
===== La déclaration des structures en C =====
En C, une structure de données est défini comme suit :
struct _Point { int x; int y } point;
Ceci défini d'une part un type nommé ''struct _Point'' et une variable ''point'' ayant comme type la structure de donnée ''struct _Point''.
Pour définir un type correspondant à la structure point, il est nécessaire en C d'écrire le code suivant :
typedef struct _Point { int x; int y } Point;
Point point;
===== Déclaration des structures en C++ =====
Dans ce cas, ''Point'' est défini comme un alias de type et désigne plus spécifiquement le type ''struct _Point''. Ecrire ''Point'' et ''struct _Point'' est équivalent.
En C++, il n'est plus nécessaire de préfixer le type ''_Point'' par ''struct''. Ainsi, il est possible d'écrire le code suivant :
struct Point { int x; int y };
struct Point pointA;
Point pointB;
==== L'initialisation des structures en C++ ====
Pour initialiser les structures en C++, il suffit de fournir comme en C 99, la liste des valeurs dans l'ordre dans lequel les champs sont définis. Ainsi écrire :
struct Point {int x; int y};
Point point = {1, 3};
std::cout << point.x << ", " << point.y << std::endl;
correspond à initialiser les champs ''x'' et ''y'' de la structure ''point'' avec les valeurs ''1'' et ''3''.
Attention, cependant, ceci n'est pas toujours vrai. En effet, s'il existe un constructeur qui prend la liste des éléments en arguments, alors, c'est ce constructeur qui sera appelé. Considérons le code suivant :
struct rational
{
int numerator;
int denominator;
rational(): numerator(0), denominator(0) {}
rational(int theNumerator): numerator(theNumerator), denominator(0) {}
rational(int theNumerator, int theDenominator)
{
if(theDenominator == 0)
throw std::invalid_argument("theDenominator");
if(theDenominator < 0)
{
theNumerator *= -1;
theDenominator *= -1;
}
numerator = theNumerator;
denominator = theDenominator;
}
};
Ecrire l'affectation suivante:
rational r = { 1, 0};
ne va pas correspondre à :
rational r;
r.numerator = 1;
r.denominator = 0;
mais à l'appel du constructeur suivant :
rational r(1, 2);
Et donc, une [[cpp:syntax:exception|exception]] de type [[https://en.cppreference.com/w/cpp/error/invalid_argument|std::invalid_argument]] sera générée.