124 votes

Structures et classes en C/C++

Après avoir terminé mon cours de C++, il m'a semblé que les structs/classes sont pratiquement identiques, à quelques différences près.

Je n'ai jamais programmé en C auparavant, mais je sais qu'il y a des structures. En C, est-il possible d'hériter d'autres structs et de définir un modificateur de public/privé ?

Si vous pouvez faire cela en C normal, pourquoi avons-nous besoin de C++ ? En quoi les classes sont-elles différentes des structures ?

165voto

Antal S-Z Points 17977

En C++ Les structs et les classes sont à peu près les mêmes ; la seule différence est que les modificateurs d'accès (pour les variables membres, les méthodes et les classes de base) des classes sont privés par défaut, alors que les modificateurs d'accès des structs sont publics par défaut.

Cependant, en C En effet, un struct n'est qu'une collection agrégée de données (publiques) et ne possède aucune autre caractéristique de type classe : pas de méthodes, pas de constructeur, pas de classes de base, etc. Bien que le C++ ait hérité du mot-clé, il en a étendu la sémantique. (C'est toutefois la raison pour laquelle les choses sont publiques par défaut dans les struct - une struct écrite comme une struct C se comporte comme telle).

Bien qu'il soit possible de simuler une certaine POO en C - par exemple, en définissant des fonctions qui prennent toutes un pointeur vers un struct comme premier paramètre, ou occasionnellement le fait de forcer les structures ayant les mêmes premiers champs à être des "sous/superclasses" - c'est toujours une sorte de boulon, et cela ne fait pas vraiment partie du langage.

16voto

Lance Diduck Points 685

En dehors des différences dans l'accès par défaut (public/privé), il n'y a aucune différence.

Cependant, certains magasins qui codent en C et C++ utiliseront "class/struct" pour indiquer ce qui peut être utilisé en C et C++ (struct) et ce qui est uniquement C++ (class). En d'autres termes, dans ce style, tous les structs doivent fonctionner en C et C++. C'est en quelque sorte la raison pour laquelle il y avait une différence en premier lieu il y a longtemps, à l'époque où le C++ était encore connu sous le nom de "C avec classes".

Notez que les unions C fonctionnent avec C++, mais pas l'inverse. Par exemple

union WorksWithCppOnly{
    WorksWithCppOnly():a(0){}
    friend class FloatAccessor;
    int a;
private:
    float b;
};

Et de même

typedef union friend{
    int a;
    float b;
} class;

ne fonctionne qu'en C

13voto

Dave Points 459

Je vais ajouter aux réponses existantes car C++ moderne est maintenant une chose et officielle Directives de base ont été créés pour répondre à ce genre de questions.

Voici une section pertinente des directives :

C.2 : Utiliser class si la classe a un invariant ; utiliser struct si les membres de la donnée peuvent varier indépendamment.

Un invariant est une condition logique pour les membres d'un objet qu'un constructeur doit établir pour que les fonctions publiques des membres puissent être assumées. Une fois l'invariant établi (généralement par un constructeur), chaque fonction membre peut être appelée pour l'objet. Un invariant peut être énoncé de manière informelle (par exemple, dans un commentaire) ou de manière plus formelle en utilisant Expects.

Si tous les membres des données peuvent varier indépendamment les uns des autres, aucun invariant n'est possible.

Si une classe possède des données privées, un utilisateur ne peut pas initialiser complètement un objet sans utiliser un constructeur. Par conséquent, le définisseur de la classe fournira un constructeur et devra spécifier sa signification. Cela signifie effectivement que le définisseur doit définir un invariant.

Application de la loi

Recherchez les structures dont toutes les données sont privées et les classes dont les membres sont publics.

Les exemples de code donnés :

struct Pair {  // the members can vary independently
    string name;
    int volume;
};

// but

class Date {
public:
    // validate that {yy, mm, dd} is a valid date and initialize
    Date(int yy, Month mm, char dd);
    // ...
private:
    int y;
    Month m;
    char d;    // day
};

Class es fonctionnent bien pour les membres qui sont, par exemple, dérivés les uns des autres ou interdépendants. Ils peuvent également faciliter le contrôle d'intégrité lors de l'instanciation. Struct fonctionnent bien pour avoir des "sacs de données", où rien de spécial ne se passe vraiment mais où les membres ont logiquement un sens en étant regroupés.

A partir de là, il est logique que class es existent pour prendre en charge l'encapsulation et d'autres concepts de codage connexes, qui struct ne sont tout simplement pas très utiles.

6voto

Il n'est pas possible de définir des fonctions membres ou de dériver des structs les uns des autres en C.

De plus, le C++ n'est pas seulement C + "derive structs". Les modèles, les références, les espaces de noms définis par l'utilisateur et la surcharge des opérateurs n'existent pas en C.

3voto

MarsRover Points 165

Une autre différence en C++, lorsque vous héritez d'une classe de struct sans spécification d'accès, cela devient un héritage public alors que dans le cas d'une classe, c'est un héritage privé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X