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;
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;
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 exception de type std::invalid_argument sera générée.