494 votes

Quelles sont les différences entre struct et class en C++ ?

Cette question a été déjà demandé dans le contexte de C#/.Net .

J'aimerais maintenant apprendre les différences entre un struct et une classe en C++. Veuillez discuter des différences techniques ainsi que des raisons de choisir l'une ou l'autre dans la conception OO.

Je vais commencer par une différence évidente :

  • Si vous ne spécifiez pas public: o private: Les membres d'une structure sont publics par défaut ; les membres d'une classe sont privés par défaut.

Je suis sûr qu'il y a d'autres différences à trouver dans les coins obscurs de la spécification C++.

9 votes

Ce site lien résume bien les différences.

1 votes

Pourquoi les gens utilisent-ils tous des structures pour construire un arbre alors ? Parce qu'il semble que la différence ne soit pas si importante. BTW, Ce c'est un site web génial. @sjsam

1 votes

Vous cherchez la différence entre struct en C et C++ ? Voir ici .

497voto

Assaf Lavie Points 20181

Vous oubliez la deuxième différence délicate entre les classes et les structs.

La norme le dit (§11.2.2 dans C++98 à C++11) :

En l'absence d'un spécification d'accès pour une classe de base, public est supposé lorsque la classe dérivée est déclarée struct et private est supposé lorsque la classe est déclarée classe .

Et pour être complet, la différence la plus connue entre class et struct est définie dans (11.2) :

Membre d'une classe définie avec l'option mot-clé classe son privé par défaut. Les membres d'une classe définie avec les mots-clés struct o syndicat son public par défaut.

Différence supplémentaire : le mot-clé class peut être utilisé pour déclarer les paramètres des modèles, tandis que l'élément struct Le mot-clé ne peut pas être utilisé de cette façon.

27 votes

Ce n'est pas vraiment une deuxième différence, c'est juste que la question énonçait la différence de manière incomplète. Tous les sous-objets sont privés par défaut lors de l'utilisation de la fonction class public par défaut avec struct et tous deux définissent une catégorie de classe.

12 votes

Je pense que tu n'as pas compris, Ben. C'est l'héritage qui est public pour les structs et privé pour les classes. C'est une distinction très importante, et complètement indépendante de l'accès réel aux membres. Par exemple, le langage aurait très bien pu le définir autrement, c'est-à-dire que les deux sont hérités publiquement par défaut, et vous auriez des implications très différentes.

114 votes

En fait, le vrai délicat différence entre struct y class est que ce dernier peut être utilisé à la place d'une typename pour déclarer un paramètre de modèle, alors que le premier ne le peut pas. :)

181voto

Robᵩ Points 50501

Citation : La FAQ C++ ,

[7.8] Quelle est la différence entre les mots-clés les mots-clés struct et class ?

Les membres et les classes de base d'un sont publics par défaut, alors que dans les classe, ils sont privés par défaut. Note : vous devez faire en sorte que vos classes de base explicitement publiques, privées, ou protected, plutôt que de vous fier aux par défaut.

Les structures et les classes sont différentes fonctionnellement équivalentes.

OK, assez de cette propreté grinçante techno. Sur le plan émotionnel, la plupart développeurs font une forte distinction entre une classe et une structure. A struct ressemble simplement à une pile ouverte de bits avec très peu de possibilités d'encapsulation encapsulation ou de fonctionnalité. A classe ressemble à un membre vivant et membre vivant et responsable de la société avec des services intelligents, une forte barrière d'encapsulation, et 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 dont les données sont publiques (ces choses existent dans les systèmes bien conçus ! systèmes bien conçus !), mais sinon vous devriez utiliser le mot-clé class.

141voto

Jon Hanna Points 40291

Il est bon de rappeler les origines du C++, et sa compatibilité avec le C.

Le C a des structs, il n'a pas de concept d'encapsulation, donc tout est public.

Le fait d'être public par défaut est généralement considéré comme une mauvaise idée lorsqu'on adopte une approche orientée objet. Ainsi, pour créer une forme de C qui soit nativement propice à la POO (vous pouvez faire de la POO en C, mais cela ne vous aidera pas), ce qui était l'idée du C++ (à l'origine "C With Classes"), il est logique de rendre les membres privés par défaut.

D'un autre côté, si Stroustrup avait changé la sémantique de struct pour que ses membres soient privés par défaut, cela aurait rompu la compatibilité (ce n'est plus aussi souvent vrai depuis que les standards ont divergé, mais tous les programmes C valides étaient aussi des programmes C++ valides, ce qui a eu un grand effet sur l'implantation du C++).

Donc un nouveau mot-clé, class a été introduit pour être exactement comme un struct, mais privé par défaut.

Si le C++ était né de rien, sans histoire, il n'aurait probablement qu'un seul mot-clé de ce type. Il n'aurait probablement pas non plus eu l'impact qu'il a eu.

En général, les gens ont tendance à utiliser struct lorsqu'ils font quelque chose qui ressemble à la façon dont les structs sont utilisés en C : membres publics, pas de constructeur (tant qu'il n'est pas dans une union, vous pouvez utiliser les structs en tant qu'unité). puede avoir des constructeurs dans les structs, comme pour les classes, mais les gens ont tendance à ne pas le faire), pas de méthodes virtuelles, etc. Puisque les langages servent autant à communiquer avec les personnes qui lisent le code qu'à instruire les machines (sinon on s'en tiendrait à l'assembleur et aux opcodes bruts des VM), c'est une bonne idée de s'en tenir à cela.

1 votes

Il convient également de noter qu'il était probablement plus facile de faire en sorte que les classes et les structures fonctionnent de la même manière sous le capot, plutôt que de les rendre fondamentalement différentes. Rétrospectivement, il aurait pu y avoir un avantage à spécifier que tout ce qui est déclaré comme une structure doit être un PODS (c'est-à-dire interdire aux structures d'avoir des membres virtuels, des constructeurs ou des destructeurs par défaut non triviaux, etc.) mais une telle chose n'a, à ma connaissance, jamais été exigée par aucun standard ou implémentation C++.

0 votes

@supercat la sorte de distinction entre plain-old-data/autre vient en elle-même de l'expérience des débuts de l'utilisation du C++, qui a bien sûr eu besoin des débuts du C++ pour arriver en premier. La toute première implémentation était en fait des macros qui ré-écrivaient la fonction class como struct en tant que fonctions avec le this pointeur explicite, et ainsi de suite. En tant que tel, il était très certainement plus facile de les faire fonctionner de la même manière !

0 votes

Le C++ n'a pas été le premier langage orienté objet, et je doute qu'il soit le premier à reconnaître les PODS comme un concept. Votre remarque sur le fait qu'un premier frontal C++ pouvait largement ignorer les structures qui existaient dans le code en même temps qu'il créait ses propres structures explique certainement en partie pourquoi le C++ se comporte comme il le fait.

36voto

Kasprzol Points 2954

Les membres de la classe sont privés par défaut. Les membres d'une structure sont publics par défaut. A part cela, il n'y a pas d'autres différences. Voir aussi cette question .

15 votes

Pas seulement les membres, mais tous les accès, y compris l'héritage.

4 votes

Eh bien, je dirais que l'autre différence est sémantique. Pour de nombreuses personnes, Struct leur fait penser que la "structure de données" est un vestige du C.

3 votes

@KrisKumler : Il ne s'agit pas de "sémantique", mais de sentiments personnels. Les deux struct y class déclarer un classe avec une sémantique identique (nonobstant l'interprétation parse-wise du corps de la définition).

32voto

crashmstr Points 15302

Selon Stroustrup, dans le Langage de programmation C++ :

Le style que vous utilisez dépend des circonstances et de vos goûts. Je préfère généralement utiliser struct pour les classes dont toutes les données sont publiques. Je considère ces classes comme des "types pas tout à fait corrects, juste des structures de données".

Sur le plan fonctionnel, il n'y a pas de différence, si ce n'est la différence entre le public et le privé.

33 votes

Quelle différence ? Veuillez expliquer.

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