1111 votes

Quand faut-il utiliser une classe ou un struct en C++ ?

Dans quels scénarios est-il préférable d'utiliser un struct contre a class en C++ ?

65 votes

Ceci n'est pas seulement applicable au C++, mais à tout langage qui fournit à la fois des structs et des classes.

4 votes

Je ne suis toujours pas d'accord - j'aborde cette question de manière sémantique. Il y a peut-être quelques différences techniques, mais sémantiquement, elles ne le sont pas. Les structures sont vraiment utiles pour créer des types de valeurs, les classes ne le sont pas.

1 votes

Je trouve que j'utilise rarement struct en C++, sauf quand j'ai besoin d'une initialisation auto-agrégée de Plain Old Data, je ne pense pas que cela puisse être fait avec des structures de données définies avec une instance d'une classe.

944voto

Commodore Jaeger Points 11949

Les différences entre un class et un struct en C++ est :

  • struct et les classes/structures de base sont public par défaut.
  • class et les classes/struts de base sont private par défaut.

Les classes et les structs peuvent avoir un mélange de public , protected y private les membres, peuvent utiliser l'héritage et peuvent avoir des fonctions membres.

Je vous recommande :

  • utiliser struct pour les structures de données simples sans caractéristiques de type classe ;
  • utiliser class lorsque vous faites usage de fonctionnalités telles que private o protected les membres, les constructeurs et opérateurs par défaut, etc.

113 votes

Une structure sans modificateurs ni méthodes est appelée structure POD, qui existe en tant qu'interface rétrocompatible avec les bibliothèques C, car il est (soi-disant) garanti qu'elle sera disposée comme s'il s'agissait d'une structure C. En dehors de cette exception, la seule différence est la suivante.

34 votes

@workmad3 : Le nom est trompeur, mais le 9/4 (C++03) dit : "Une POD-struct est une classe agrégée qui n'a pas de membres de données non statiques de type non-POD-struct, non-POD-union (ou tableau de tels types) ou référence, et qui n'a pas d'opérateur d'affectation de copie défini par l'utilisateur et pas de destructeur défini par l'utilisateur". Il n'y a aucune restriction sur l'utilisation de la clé de classe "struct" et aucune restriction sur l'utilisation de "public" (voir 8.5.1/1 pour les exigences agrégées). Il ne s'agit pas d'une différence entre "struct" et "class".

6 votes

Votre utilisation du terme "agrégat" pourrait être mal comprise, compte tenu de la définition de la norme :)

262voto

quark Points 7773

Comme tout le monde le fait remarquer, il n'y a que deux différences linguistiques réelles :

  • struct par défaut, l'accès public et class Par défaut, l'accès est privé.
  • Lors d'un héritage, struct La valeur par défaut est public l'héritage et class La valeur par défaut est private l'héritage. (Ironiquement, comme pour beaucoup de choses en C++, le défaut est à l'envers : public l'héritage est de loin le choix le plus courant, mais les gens déclarent rarement struct juste pour éviter de devoir taper le " public mot-clé ".

Mais la véritable différence dans la pratique se situe entre un class / struct qui déclare un constructeur/destructeur et un autre qui ne le fait pas. Il existe certaines garanties pour un type POD "plain-old-data", qui ne s'appliquent plus lorsque vous prenez en charge la construction de la classe. Pour que cette distinction reste claire, de nombreuses personnes utilisent délibérément uniquement les types struct pour les types POD, et, s'ils doivent ajouter des méthodes, utiliser class es. La différence entre les deux fragments ci-dessous est par ailleurs sans signification :

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Soit dit en passant, voici un fil de discussion contenant de bonnes explications sur la signification de "type POD" : Que sont les types POD en C++ ? )

0 votes

Bel exemple concernant les différences d'héritage : ici .

10 votes

Que vous utilisiez struct o class n'a aucune incidence sur le fait que votre objet soit POD ou que vous deviez définir un constructeur/destructeur de copie. Les fonctions membres n'ont pas non plus d'incidence sur le fait qu'un objet soit POD. En relisant ce que vous avez écrit, je vois que vous ne suggérez pas le contraire, mais la formulation actuelle est confuse.

1 votes

@DavidStone Fondamentalement, les structs POD sont censés être garantis pour être rétrocompatibles avec le code C, et sont donc fondamentalement censés être conçus comme des structs de style C.

57voto

Ferruccio Points 51508

La seule fois où j'utilise une structure au lieu d'une classe, c'est lorsque je déclare un foncteur juste avant de l'utiliser dans un appel de fonction et que je veux minimiser la syntaxe pour des raisons de clarté, par exemple :

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare());

39 votes

Aujourd'hui, plusieurs années se sont écoulées et C++11 est pris en charge par tous les principaux compilateurs, Les lambdas rendent les choses encore plus concises .

42voto

Tal Pressman Points 4120

De la FAQ C++ Lite :

Les membres et les classes de base d'une structure sont publics par défaut, alors que dans les classes, ils sont privés par défaut. Remarque : vous devriez rendre vos classes de base explicitement publiques, privées ou protégées, plutôt que de vous fier aux valeurs par défaut.

struct et class sont par ailleurs fonctionnellement équivalents.

OK, assez de cette conversation techno. Sur le plan émotionnel, la plupart des développeurs font une forte distinction entre une classe et un struct. Une structure ressemble simplement à une pile ouverte de bits avec très peu d'encapsulation ou de fonctionnalité. Une classe ressemble à un membre vivant et responsable de la société, doté de services intelligents, d'une solide barrière d'encapsulation et d'une interface bien définie. Puisque c'est la connotation que la plupart des gens ont déjà, vous devriez probablement utiliser le mot-clé struct si vous avez une classe qui a très peu de méthodes et qui a des données publiques (de telles choses existent dans les systèmes bien conçus !), mais sinon vous devriez probablement utiliser le mot-clé class.

1 votes

Je ne comprends pas pourquoi ils affirment que struct et class sont fonctionnellement les mêmes, mais disent de préférer l'un à l'autre dans certains cas sans aucun raisonnement .

5 votes

La raison en est la convention. Le compilateur ne se soucie pas de celle que vous utilisez, mais un autre développeur qui regarde votre code aura plus de facilité à comprendre ce que vous vouliez dire.

4 votes

@deetz : Tout le troisième paragraphe est un raisonnement.

23voto

mbyrne215 Points 827

Un cas où une structure m'a été utile est celui d'un système qui reçoit des messages à format fixe (sur un port série, par exemple) d'un autre système. Vous pouvez convertir le flux d'octets en un struct qui définit vos champs, puis accéder facilement à ces derniers.

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

Évidemment, c'est la même chose que vous feriez en C, mais je trouve que la surcharge de devoir décoder le message dans une classe n'en vaut généralement pas la peine.

0 votes

La même chose peut être réalisée en C.

13 votes

Ou vous pouvez simplement mettre en œuvre operator >> sur une classe au lieu d'écrire le processMessage ce qui ferait que votre C++ ressemblerait davantage à du C++ et moins à du C.

2 votes

Outre le fait qu'elle n'est pas portable entre différents systèmes, cette méthode viole les règles d'aliasing et son fonctionnement n'est pas garanti, même au sein d'une seule architecture.

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