C / C++ Struct vs Class

après avoir terminé ma Classe C++, il m'a semblé que les structures/classes étaient pratiquement identiques sauf quelques différences mineures.

je n'ai jamais programmé en C avant; mais je sais qu'il a des structures. C est-il possible d'hériter d'autres structures et définir un modificateur de public/privé?

Si vous pouvez le faire régulièrement C pourquoi avons-nous besoin de C++? Qu'est-ce qui rend les classes différentes d'une struct?

98
demandé sur Antal Spector-Zabusky 2010-05-01 18:20:27

6 réponses

dans 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 par défaut à private, les modificateurs d'accès dans les structures par défaut à public.

Toutefois, C , une struct est juste un agrégat de collecte (publique) de données, et n'a pas d'autre classe comme caractéristiques: aucune méthode, aucun constructeur, pas de classes de base, etc. Bien C++ a hérité du mot-clé, il a étendu la sémantique. (Ceci, cependant, est la raison pour laquelle les choses par défaut au public dans les structures-une structure écrite comme une structure C se comporte comme une structure.)

alors qu'il est possible de simuler une certaine OOP en C-par exemple, définir des fonctions qui prennent toutes un pointeur vers une structure comme premier paramètre, ou occasionnellement coercing structs avec les mêmes premiers champs pour être "sub / superclasses"-c'est toujours en quelque sorte boulonné, et n'est pas vraiment une partie de la langue.

135
répondu Antal Spector-Zabusky 2017-08-08 14:22:15

sauf 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 c++ seulement (class). En d'autres termes, dans ce style Toutes les structures doivent fonctionner avec C et C++. C'est un peu la raison pour laquelle il y avait une différence à la première place il y a longtemps, quand C++ était encore connu sous le nom de "C avec Classes."

notez que les syndicats C travaillent avec C++, mais pas l'inverse. Par exemple

union WorksWithCppOnly{
    WorksWithCppOnly():a(0){}
    friend class FloatAccessor;
    int a;
private:
    float b;
};

et de même

typedef union friend{
    int a;
    float b;
} class;

fonctionne uniquement en C

14
répondu Lance Diduck 2010-05-01 15:08:18

il n'est pas possible de définir des fonctions de membre ou dériver des structures les uns des autres en C.

aussi, C++ n'est pas seulement C + "dériver structs". Les modèles, les références, les espaces de noms définis par l'utilisateur et la surcharge de l'opérateur n'existent pas en C.

6
répondu Johannes Schaub - litb 2010-05-01 14:22:02

je vais ajouter aux réponses existantes parce que c++ moderne est maintenant une chose et officiel lignes directrices de base ont été créés pour aider avec des questions comme celles-ci.

Voici une section pertinente des lignes directrices:

C. 2: Classe D'utilisation si la classe a un invariant; structure d'utilisation si les membres de données peuvent varier indépendamment

Un invariant est une condition logique pour les membres d'un objet qu'un constructeur doit établir pour les fonctions membres publiques à assumer. Après l'invariant est établi (généralement par un constructeur) chaque fonction membre peut être appelé pour l'objet. Un invariant peut être énoncé de façon informelle (par exemple, dans un commentaire) ou plus formellement en utilisant des attentes.

si tous les membres de données peuvent varier indépendamment les uns des autres, aucun invariant est possible.

si une classe possède des données privées, un utilisateur ne peut pas initialiser complètement un objet sans l'aide d'un constructeur. Par conséquent, la classe definer fournira un constructeur et devra spécifier sa signification. Cela signifie effectivement la nécessité de définir un invariant.

"1519170920 de" l'Application

rechercher des structures avec toutes les données privées et des classes avec des membres publics.

les exemples de code donnés:

struct Pair {  // the members can vary independently
    string name;
    int volume;
};

// but

class Date {
public:
    // validate that {yy, mm, dd} is a valid date and initialize
    Date(int yy, Month mm, char dd);
    // ...
private:
    int y;
    Month m;
    char d;    // day
};

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 avec des vérifications lors de l'instanciation. Struct S fonctionne bien pour avoir des "sacs de données", où rien de spécial est vraiment en cours, mais les membres logiquement faire sens être regroupés ensemble.

de ceci, il est logique que class existe à support encapsulation et d'autres concepts de codage connexes, que struct s sont tout simplement pas très utiles pour.

6
répondu Dave 2016-10-14 16:45:43

une différence de plus en C++, quand vous héritez d'une classe de struct sans aucun spécificateur d'accès, cela devient un héritage public où comme dans le cas de classe c'est un héritage privé.

3
répondu MarsRover 2012-09-12 12:07:52

c++ utilise des structures principalement pour 1) la compatibilité à rebours avec C et 2) les types de gousses. Les structures C n'ont pas de méthodes, d'héritage ou de visibilité.

1
répondu Chris Hafey 2010-05-01 14:29:42