C et très probablement de nombreuses autres langues fournissent un struct
mot - clé pour créer des structures (ou quelque chose de manière similaire). Ce sont (au moins en C), d'un point de vue simplifié comme les classes, mais sans polymorphisme, héritage, méthodes, etc.
Pensez à un langage orienté objet (ou multi paradigme) avec des structures de style C. Où les choisiriez-vous plutôt que les cours? Maintenant, je ne pense pas qu'ils doivent être utilisés avec la POO car les classes semblent remplacer leurs objectifs, mais je me demande s'il y a des situations où elles pourraient être préférées aux classes dans des programmes autrement orientés objet et dans quel genre de situations. Existe-t-il de telles situations?
Réponses:
Il y a une distinction que j'ai vue dans certains livres entre les objets porteurs d'état et les objets fournissant des fonctionnalités. Les termes exacts diffèrent d'une source à l'autre. Mais d'une manière générale, les premiers se distinguent par leur tas de champs et tout un tas de simples paires getters-setters (et peut-être un constructeur).
Celles-ci sont particulièrement courantes en Java, pour les classes qui sont explicitement marquées comme "sérialisables".
Je dirais que ce type de classes a le plus de sens en tant que structures, si vous pensez qu'il n'est pas nécessaire de masquer directement les membres (par exemple, dans le cas de types imbriqués).
la source
En C, il n'y a pas de classes, tout
struct
comme la façon de regrouper les données. En C ++,struct
c'est la même chose queclass
sauf que l'héritage et l'accès aux membres sontpublic
par défaut plutôt queprivate
. C # a également une sorte destruct
, mais je ne connais pas assez C # pour commenter. Common Lisp a ladefstruct
forme, qui fonctionne autant comme Cstruct
s que possible, compte tenu de la différence de langage, et elle est différente d'une classe Common Lisp Object System.Il existe cependant une différence conceptuelle entre un ensemble de données associé et une classe réelle, et en C ++
struct
est souvent utilisé pour un ensemble de données, tandis qu'ilclass
est utilisé pour des objets qui sont censés avoir leur propre comportement. À titre indicatif, je dirais que aclass
représente quelque chose sur lequel vous pouvez dire quelque chose d'utile, comme un invariant de classe, tandis que astruct
serait plus lâchement associé à des valeurs de données ne dépendant pas vraiment beaucoup d'autres.la source
struct
et aclass
est plus significative en C # - la grande chose étant que astruct
est un type valeur et aclass
est un type référence. Microsoft recommande de ne pas utiliser unstruct
si le contenu sera supérieur à 16 octets environ.À un niveau très basique, quelle est la différence entre une structure et une classe de données pure (qui n'a aucune fonctionnalité en dehors des accesseurs de propriété)?
Rien que l'empreinte mémoire vraiment.
la source
La réponse acceptée est bonne. Je voudrais juste ajouter ...
Parfois, il vaut mieux mettre une méthode dans une classe. D'autres fois, il est préférable d'avoir une fonction externe dans laquelle la structure / classe est passée en tant que paramètre (même si vous faites du style OOP).
exemple de moment pour placer une méthode dans la classe: Rectangle.CaclulateArea ()
exemple de moment pour placer une fonction en dehors de la classe: Canvas.Draw (Rectangle rect)
vous pouvez mettre Draw () à l'intérieur du rectangle et cela fonctionnera. Mais le dessin est une opération dépendante du niveau. Vous ne dessineriez pas côté serveur, mais côté client. Draw () n'aurait même pas de sens d'exister sur le serveur. Cependant, "CalculateArea ()" est indépendant du niveau et est un véritable attribut du rectangle, il est donc préférable de l'inclure en tant que méthode membre.
la source
Pour moi, la grande différence est de savoir s'il existe un invariant de classe ou non.
Ou en d'autres termes: suis-je libre de changer n'importe quel champ en n'importe quelle valeur à tout moment? Si c'est le cas, c'est une structure; Sinon, c'est une classe.
L'exemple habituel d'une structure est un point 2D, avec juste un membre X et Y, qui peut avoir n'importe quelle valeur et est totalement indépendant l'un de l'autre. L'accès du public est acceptable.
Un exemple de classe est la combinaison d'un pointeur sur un tableau de caractères et d'un champ de longueur: la longueur dépend de la valeur du pointeur, et donc ce ne devrait pas être une structure. Les champs doivent être privés et l'accès doit passer par des setters et des getters pour garantir l'invariant de classe.
la source
1) Réseau
struct
s: structures qui sont transmises sur le fil.Plus généralement et formellement, toute classe dont vous avez besoin pour être POD, trivial, standard-layout ou un concept connexe. Pour une excellente discussion de ces concepts, avec des exemples, voir cette réponse (c'est pour C ++ 11).
2) Des foncteurs (prédicats en particulier), que vous passeriez à des fonctions comme
std::remove_if
. Autrement dit, des classes similaires à / héritéesstd::binary_function
ou similaires.3) Concepts de méta-programmation, qui ne peuvent contenir que des
constexpr
s et / ou destypedef
s publics .Edit: Remarque: Cette réponse s'applique aux classes C ++ vs aux structures.
la source