Après avoir terminé ma classe C ++, il m'a semblé que les structures / classes sont pratiquement identiques, sauf avec quelques différences mineures.
Je n'ai jamais programmé en C avant; mais je sais qu'il a des structures. En C est-il possible d'hériter d'autres structures et de définir un modificateur de public / private?
Si vous pouvez faire cela en C normal, pourquoi avons-nous besoin de C ++? Qu'est-ce qui différencie les classes d'une structure?
Réponses:
En C ++ , les structures et les classes sont à peu près les mêmes; la seule différence est que lorsque les modificateurs d'accès (pour les variables membres, les méthodes et les classes de base) dans les classes sont par défaut privés, les modificateurs d'accès des structures par défaut sont publics.
Cependant, en C , une structure est juste une collection agrégée de données (publiques), et n'a pas d'autres fonctionnalités de type classe: pas de méthode, pas de constructeur, pas de classes de base, etc. Bien que C ++ ait hérité du mot-clé, il a étendu la sémantique. (Ceci, cependant, est la raison pour laquelle les choses par défaut sont publiques dans les structures - une structure écrite comme une structure C se comporte comme une.)
Bien qu'il soit possible de simuler une certaine POO en C - par exemple, définir des fonctions qui prennent toutes un pointeur vers une structure comme premier paramètre, ou forcer occasionnellement des structures avec les mêmes premiers champs à être des "sous / superclasses" - c'est toujours en quelque sorte boulonné, et ne fait pas vraiment partie de la langue.
la source
Autre que les différences dans l'accès par défaut (public / privé), il n'y a pas de 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 qui sont uniquement en C ++ (class). En d'autres termes, dans ce style, toutes les structures doivent fonctionner avec C et C ++. C'est en quelque sorte la raison pour laquelle il y avait une différence à l'origine il y a longtemps, à l'époque où 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
Et également
ne fonctionne qu'en C
la source
Je vais ajouter aux réponses existantes car le C ++ moderne est maintenant une chose et des directives de base officielles ont été créées pour aider avec des questions comme celles-ci.
Voici une section pertinente des directives:
Les exemples de code donnés:
Class
es fonctionnent bien pour les membres qui sont, par exemple, dérivés les uns des autres ou interdépendants. Ils peuvent également aider à vérifier la cohérence lors de l'instanciation.Struct
s 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 à être regroupés.À partir de là, il est logique que
class
es existent pour prendre en charge l'encapsulation et d'autres concepts de codage associés, pour lesquels lesstruct
s ne sont tout simplement pas très utiles.la source
struct
s sont les plus portables. Ils peuvent être utilisés en C ou C ++ ou dans les deux sens. Ils peuvent également être décompressés en Python à l'aide dustruct
module, par exemple. Si votre projet établit les priorités de compatible avec d' autres langues, interfaces ou systèmes, préfèrentstruct
plusclass
. Pour les affaires strictement internes au programme, préférezclass
.Il n'est pas possible de définir des fonctions membres ou de dériver des structures les unes des autres en C.
En outre, C ++ n'est pas seulement C + "dériver des structures". Les modèles, les références, les espaces de noms définis par l'utilisateur et la surcharge d'opérateurs n'existent pas tous dans C.
la source
power
des structures de C. Donc, C ++ utilise uniquement des structures pour être «rétrocompatible» avec C?struct
je veux dire un type de chose de type POD largement passif.std::less
) sont définis comme des structures, pas comme des classes.Une autre différence en C ++, lorsque vous héritez d'une classe de struct sans aucun spécificateur d'accès, cela devient l'héritage public où, comme dans le cas de la classe, c'est l'héritage privé.
la source
C ++ utilise principalement des structures pour 1) la compatibilité ascendante avec les types C et 2) POD. Les structures C n'ont pas de méthodes, d'héritage ou de visibilité.
la source
std::less
) sont définis comme des structures, pas comme des classes.