User Tools

Site Tools


cpp:syntax:struct

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

cpp/syntax/struct.txt · Last modified: 2022/11/18 10:47 (external edit)