Classe contre structure

12

En C ++ et dans d'autres langages influencés, il existe une construction appelée Structure ( struct) et une autre appelée class. Les deux sont capables de contenir des fonctions et des variables. Quelques différences:

  1. La classe reçoit de la mémoire dans le tas et de la structmémoire dans la pile (remarque: c'est faux pour C ++, mais peut-être correct dans ce que l'OP a appelé "langages influencés")
  2. Les variables de classe sont privées par défaut et structelles sont publiques

Ma question est: a été en structquelque sorte abandonné pour la classe? Si oui, pourquoi? Outre les différences ci-dessus, a structpeut faire toutes les mêmes choses qu'une classe. Alors pourquoi l'abandonner?

prometheuspk
la source
par abandon, je voulais dire pourquoi l'un est utilisé sur l'autre.
prometheuspk
votre question répond elle-même, je pense.
Umair A.
3
La différence entre les classes et les structures dépend du langage. Certaines leçons de C ++ ne s'appliquent pas vraiment à C #.
Job
6
Uhhhh. En C ++, vous pouvez allouer des objets sur la pile ou le tas. Où tu veux.
jojo
8
Faux, faux, faux. La pile contre le tas n'a rien à voir avec la différence.
Aaronaught

Réponses:

11

Il n'est pas du tout abandonné. En fait, même les langages modernes comme C # qui font un usage classintensif de vous offrent toujours struct. Quant au moment où il est utile de choisir l'un plutôt que l'autre, je vous renvoie à cet article:

Choisir entre les classes et les structures

Extrait de l'article MSDN:

Envisagez de définir une structure au lieu d'une classe si les instances du type sont petites et généralement de courte durée ou sont généralement intégrées dans d'autres objets.

Ne définissez une structure que si le type possède toutes les caractéristiques suivantes:

  • Il représente logiquement une valeur unique, similaire aux types primitifs (entier, double, etc.).
  • Il a une taille d'instance inférieure à 16 octets.
  • C'est immuable.
  • Il n'aura pas à être emballé fréquemment.
blubb
la source
4
Cette réponse est vraiment erronée car la signification de la structure / classe .Net / C # est différente de celle de C ++: ils utilisent le même nom mais ont une sémantique différente selon la langue !!! En C ++, il n'y a presque pas de différence entre struct et class et la question est totalement erronée sur le premier point, qui est correct en c # et D mais pas en c ++. Le lien vers cet article, qui concerne .Net, est donc vraiment vraiment faux. Ce n'est pas du C ++!
Klaim
@Klaim n'est techniquement pas bon non plus pour C # (les structures peuvent être sur le tas) La distinction importante en C # est entre la sémantique des valeurs et la sémantique de référence, une distinction dont C ++ n'a pas besoin car il peut avoir des valeurs ou des références pour quoi que ce soit
jk.
17

Vous vous trompez sur C ++: la seule différence significative entre classe et struct est la différence de spécificateur d'accès par défaut. Struct et classe sont à toutes fins utiles synonymes, je crois que struct est conservé pour une compatibilité ascendante avec C.

Joris Timmermans
la source
7
Pas seulement. Struct est un bon choix lorsque vous voulez simplement vider un tas de données dans un objet et n'y ajouter aucun comportement.
quant_dev
2
@quant: C'est une terrible raison d'utiliser une structure. J'espère vraiment que ce commentaire était ironique.
Aaronaught
1
@Aaronaught Pourquoi? Mon point de vue sur l'utilisation de struct est assez standard, voir cette réponse par exemple: stackoverflow.com/questions/54585/…
quant_dev
1
@Aaronaught Comment renvoyez-vous alors plusieurs valeurs? Disons, un modèle de traitement renvoie le prix net, le prix sale et la somme des paiements accumulés.
quant_dev
1
@quant_dev - vous pouvez décider d'attacher une méta-signification à une structure à vos fins (et pour les anciens programmeurs C qui fait vraiment beaucoup de sens), mais cela ne change pas le fait que la seule différence entre la structure et les mots-clés de classe en C ++ sont l'accès par défaut.
Joris Timmermans
2

le langage D a créé une plus grande distinction entre classe et struct

une structure en d n'est rien d'autre qu'un enregistrement de données alloué par pile avec quelques fonctions que vous pouvez appeler dessus (il n'y a pas d'option d'héritage à moins que vous n'utilisiez une configuration enum + union c'est-à-dire implémentez vous-même le polymorfisme) qui est passé par valeur

une classe est comme nous sommes habitués à: fonctions virtuelles, allocation de tas, héritage (unique), passé par ref

monstre à cliquet
la source