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

441

Cette question a déjà été posée dans le cadre de C # /. Net .

Maintenant, j'aimerais apprendre les différences entre une structure 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:ou 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 existe d'autres différences dans les coins obscurs de la spécification C ++.

palm3D
la source
6
Ce lien résume bien les différences.
sjsam
1
Pourquoi les gens utilisent-ils tous struct pour construire un arbre alors? Parce qu'il semble que la différence n'est pas si grande. BTW, c'est un excellent site Web. @ Sjsam
JW.ZG
1
Vous cherchez la différence entre structC et C ++? Voyez ici .
Marc.2377
@ JW.ZG Pas "tous" les gens! Ceux qui le font préfèrent simplement ou ne réalisent pas ce que structsignifie C ++. ;) Mais il n'y a aucune raison de ne pas utiliser le classmot - clé à la place.
Courses de légèreté en orbite le

Réponses:

466

Vous oubliez la 2ème différence délicate entre les classes et les structures.

Quoth la norme (§11.2.2 en C ++ 98 à C ++ 11):

En l'absence d'un spécificateur 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 juste pour être complet, la différence la plus connue entre classe et struct est définie dans (11.2):

Les membres d'une classe définie avec le mot-clé class sont privés par défaut. Les membres d'une classe définie avec les mots - clés struct ou union sont publics par défaut.

Différence supplémentaire: le mot-clé classpeut être utilisé pour déclarer des paramètres de modèle, tandis que le structmot - clé ne peut pas être utilisé ainsi.

Assaf Lavie
la source
22
Ce n'est pas vraiment une deuxième différence, c'est juste que la question a indiqué la différence de manière incomplète. Tous les sous-objets sont privés par défaut lors de l'utilisation de class, public par défaut avec struct, et les deux définissent un type de classe.
Ben Voigt
10
Je pense que vous avez manqué le point, Ben. C'est l'héritage qui est public pour les structures et privé pour les classes. C'est une distinction très importante et totalement indépendante de l'accès réel des membres. Par exemple, le langage aurait très bien pu le définir autrement, par exemple les deux sont hérités publiquement par défaut, et vous obtiendriez des implications très différentes.
Assaf Lavie
104
En fait, la vraie différence délicate entre structet classest que ce dernier peut être utilisé à la place d'un typenamepour déclarer un paramètre de modèle, tandis que le premier ne le peut pas. :)
sbi
21
@MrUniverse: C'est totalement faux. (Il y a une école qui l'utilise pour une convention, mais elle n'est pas appliquée syntaxiquement.)
sbi
3
@sbi "la vraie différence délicate entre struct et classe" - Mignon, mais la question porte sur la différence entre une struct et une classe, et non sur les différences quant à l'endroit où les mots-clés peuvent être utilisés.
Jim Balter
161

Citant la FAQ C ++ ,

[7.8] Quelle est la différence entre la structure des mots clés et la classe?

Les membres et les classes de base d'une structure sont publics par défaut, tandis qu'en classe, ils sont par défaut privés. Remarque: vous devez rendre vos classes de base explicitement publiques, privées ou protégées, plutôt que de vous fier aux valeurs par défaut.

Struct et classe sont par ailleurs fonctionnellement équivalents.

OK, assez de cette conversation techno propre et grinçante. Sur le plan émotionnel, la plupart des développeurs font une forte distinction entre une classe et une structure. Une structure ressemble simplement à une pile ouverte de bits avec très peu d'encapsulation ou de fonctionnalité. Une classe se sent comme un 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 a des données publiques (de telles choses existent dans des systèmes bien conçus!), Mais sinon vous devriez probablement utiliser la classe mot-clé.

Robᵩ
la source
123

Il convient de se rappeler les origines de C ++ et sa compatibilité avec C.

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

Être public par défaut est généralement considéré comme une mauvaise idée lorsque vous adoptez une approche orientée objet, donc en créant une forme de C qui est nativement propice à la POO (vous pouvez faire de l'OO en C, mais cela ne vous aidera pas). idée en C ++ (à l'origine "C With Classes"), il est logique de rendre les membres privés par défaut.

En revanche, si Stroustrup avait changé la sémantique de structafin que ses membres soient privés par défaut, cela aurait rompu la compatibilité (ce n'est plus aussi souvent vrai que les normes divergeaient, mais tous les programmes C valides étaient également des programmes C ++ valides, qui a eu un grand effet sur le fait de donner un pied à C ++).

Un nouveau mot clé a donc classété introduit pour être exactement comme une structure, mais privé par défaut.

Si C ++ était venu de zéro, sans historique, il n'aurait probablement qu'un seul de ces mots clés. Cela n'aurait probablement pas non plus eu l'impact qu'il a eu.

En général, les gens auront tendance à utiliser struct lorsqu'ils font quelque chose comme la façon dont les structures sont utilisées en C; les membres publics, pas de constructeur (tant que ce n'est pas dans une union, vous pouvez avoir des constructeurs dans des structures, comme avec les classes, mais les gens ont tendance à ne pas le faire), pas de méthodes virtuelles, etc. Puisque les langages sont autant pour communiquer avec les gens qui lisent le code pour instruire les machines (ou bien nous nous en tiendrons aux assemblages et aux opcodes VM bruts), c'est une bonne idée de s'en tenir à cela.

Jon Hanna
la source
Il convient également de noter qu'il était probablement plus facile de faire fonctionner les classes et les structures sous le capot, plutôt que de les faire fondamentalement différentes. Rétrospectivement, il aurait pu être utile, par exemple, de 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 destructeurs par défaut non triviaux, etc.), mais une telle chose n'a pas à ma connaissance jamais été requis par aucune norme ni implémentation C ++.
supercat
1
@supercat le fait qu'il s'agissait d'une langue OO dans laquelle un vaste répertoire de programmes écrits dans une langue non OO étaient des programmes valides, a mis le concept en avant et il semble y être plus présent que dans des langues plus purement OO (et bien sûr est en fait défini dans la norme). L'histoire du début du C ++ en explique certainement beaucoup. "La conception et l'évolution de C ++" de Stroustrup est une lecture intéressante.
Jon Hanna
1
Je perçois une guerre religieuse entre les gens qui pensent que tout ce qui est pas « oop-ish », devrait être, et ceux qui pensent que la POO doit être considérée comme un outil, mais pas l' outil. Le C ++ semble certainement embrasser cette dernière philosophie, mais je ne connais vraiment pas grand-chose aux langages avant. Ma propre philosophie est que quand on veut un objet, on doit utiliser un objet, et quand on veut une agrégation de variables liées mais indépendantes, on doit l'utiliser. C ++ ne fait aucune distinction syntaxique entre ce genre de choses, et .NET essaie de brouiller cette distinction, mais le peu que je connaisse de D ...
supercat
1
... suggère qu'il le reconnaît plus que C ++ ou .NET. Les agrégations de variables ne sont pas exactement OOPish, mais cela ne signifie pas qu'elles ne devraient pas être utilisées lorsqu'elles sont utiles .
supercat
3
Je suis en désaccord avec « C a struct, il n'a pas de concept d'encapsulation, donc tout est public. », Vous pouvez masquer une définition d'un structintérieur d' une *.c-File et laisser d' autres unités de traductions utilisent uniquement avec un pointeur. Vous avez donc une encapsulation encore plus forte, car les autres unités de traduction ne savent même pas ce qui se trouve à l'intérieur du struct.
12431234123412341234123
32

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

Kasprzol
la source
15
Non seulement les membres, mais tous les accès, y compris l'héritage.
Nemanja Trifunovic
4
Eh bien, je dirais que l'autre différence est la sémantique. Structurer de nombreuses personnes les fait penser à la "structure de données" comme un reste de C.
Kris Kumler
3
@KrisKumler: Ce ne sont pas des "sémantiques"; ce sont des sentiments personnels. Les deux structet classdéclarent une classe avec une sémantique identique (nonobstant l'interprétation par analyse du corps de définition).
Courses de légèreté en orbite le
28

Selon Stroustrup dans le langage de programmation C ++ :

Le style que vous utilisez dépend des circonstances et du goût. Je préfère généralement utiliser structpour les classes qui ont toutes les données publiques. Je pense à ces classes comme «des types pas tout à fait appropriés, juste des structures de données».

Fonctionnellement, il n'y a pas de différence autre que le public / privé

crashmstr
la source
32
Quelle différence? S'il vous plaît, expliquez.
crashmstr
10

STRUCT est un type de type de données abstrait qui divise un bloc de mémoire donné en fonction de la spécification de la structure. Les structures sont particulièrement utiles dans la sérialisation / désérialisation de fichiers car la structure peut souvent être écrite dans le fichier mot pour mot. (c'est-à-dire obtenir un pointeur sur la structure, utilisez la macro SIZE pour calculer le nombre d'octets à copier, puis déplacez les données dans ou hors de la structure.)

Les classes sont un type différent de type de données abstrait qui tentent d'assurer le masquage des informations. En interne, il peut y avoir une variété de machinations, de méthodes, de variables temporaires, de variables d'état. etc. qui sont tous utilisés pour présenter une API cohérente à tout code qui souhaite utiliser la classe.

En effet, les structures concernent les données, les classes concernent le code.

Cependant, vous devez comprendre que ce ne sont que des abstractions. Il est parfaitement possible de créer des structures qui ressemblent beaucoup à des classes et des classes qui ressemblent beaucoup à des structures. En fait, les premiers compilateurs C ++ n'étaient que des précompilateurs qui traduisent le code C ++ en C. Ainsi, ces abstractions sont un avantage pour la pensée logique, pas nécessairement un atout pour l'ordinateur lui-même.

Au-delà du fait que chacun est un type d'abstraction différent, les classes fournissent des solutions au casse-tête de nommage du code C. Comme vous ne pouvez pas avoir plus d'une fonction exposée avec le même nom, les développeurs suivaient un modèle de _ (). par exemple mathlibextreme_max (). En regroupant les API en classes, des fonctions similaires (que nous appelons ici "méthodes") peuvent être regroupées et protégées contre la dénomination des méthodes dans d'autres classes. Cela permet au programmeur de mieux organiser son code et d'augmenter la réutilisation du code. En théorie du moins.

64BitBob
la source
1
C'est la chose la plus évidente à propos des structures et des classes. "Les structures concernent les données, les classes concernent le code" peut être reformulée comme "les structures concernent les données, les classes concernent les données, la sécurité et les opérations effectuées sur ces données"
Arun Aravind
3
Il n'est pas possible de créer une structure en C ++. Il n'est possible de créer une classe qu'en utilisant le structmot clé hérité .
Courses de légèreté en orbite
1
Cette réponse ne semble pas concerner le C ++. En C ++, structdéclare les classes (y compris public/ private/ protected, l'héritage, etc.).
melpomene
Comment les structures sont-elles abstraites? L'écriture de structures brutes dans un fichier est lourde de problèmes même en C (les problèmes habituels incluent le remplissage, l'endianité, la taille différente des mots, etc.) De quelle SIZEmacro parlez-vous?
melpomene
10

1) Les membres d'une classe sont privés par défaut et les membres de struct sont publics par défaut.

Par exemple, le programme 1 échoue dans la compilation et le programme 2 fonctionne correctement.

// Program 1
#include <stdio.h>

class Test {
    int x; // x is private
};
int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}
Run on IDE
// Program 2
#include <stdio.h>

struct Test {
    int x; // x is public
};
int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}

2) Lors de la dérivation d'une structure à partir d'une classe / structure, le spécificateur d'accès par défaut pour une classe / structure de base est public. Et lors de la dérivation d'une classe, le spécificateur d'accès par défaut est privé.

Par exemple, le programme 3 échoue dans la compilation et le programme 4 fonctionne correctement.

// Program 3
#include <stdio.h>

class Base {
public:
    int x;
};

class Derived : Base { }; // is equilalent to class Derived : private Base {}

int main()
{
  Derived d;
  d.x = 20; // compiler error becuase inheritance is private
  getchar();
  return 0;
}
Run on IDE
// Program 4
#include <stdio.h>

class Base {
public:
    int x;
};

struct Derived : Base { }; // is equilalent to struct Derived : public Base {}

int main()
{
  Derived d;
  d.x = 20; // works fine becuase inheritance is public
  getchar();
  return 0;
}
Suraj K Thomas
la source
J'ai supprimé les exemples de code 3-7 tels que mentionnés par les experts
Suraj K Thomas
8

La seule autre différence est l'héritage par défaut des classes et des structures, qui, sans surprise, est respectivement privé et public.

Skizz
la source
5
  1. Les membres d'une structure sont publics par défaut, les membres de la classe sont privés par défaut.
  2. L'héritage par défaut pour la Structure d'une autre structure ou classe est public. L'héritage par défaut pour la classe d'une autre structure ou classe est privé.
class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

C'est sur VS2005.

melpomene
la source
_tmainn'est pas C ++ standard.
melpomene
4

Pas dans la spécification, non. La principale différence réside dans les attentes des programmeurs lorsqu'ils lisent votre code en 2 ans. les structures sont souvent supposées être POD. Les structures sont également utilisées dans la métaprogrammation de modèles lorsque vous définissez un type à des fins autres que la définition d'objets.

MSalters
la source
4

Une autre chose à noter, si vous avez mis à jour une application héritée qui avait des structures pour utiliser des classes, vous pourriez rencontrer le problème suivant:

L'ancien code a des structures, le code a été nettoyé et changé en classes. Une ou deux fonctions virtuelles ont ensuite été ajoutées à la nouvelle classe mise à jour.

Lorsque les fonctions virtuelles sont dans des classes, le compilateur ajoute en interne un pointeur supplémentaire aux données de classe pour pointer vers les fonctions.

Comment cela briserait l'ancien code hérité si dans l'ancien code quelque part la structure était effacée en utilisant memfill pour effacer tout cela à zéro, cela écraserait également les données de pointeur supplémentaires.

KPexEA
la source
1
Le code qui utilise memfill pour effacer une structure a probablement d'autres habitudes offensantes. Allez-y avec prudence.
David Thornley
@DavidThornley: L'utilisation d'un remplissage nul pour effacer ou initialiser une structure de données est standard en C. Dans un projet en langage mixte, on ne peut pas s'attendre à ce que le code de la partie C évite callocen faveur de new. Tout ce que l'on peut faire est d'essayer de s'assurer que toutes les structures utilisées par la partie C du code sont bien des PODS.
supercat
4
  1. Les membres d'une classe définie avec le mot clé classsont privatepar défaut. Les membres d'une classe définie avec les mots-clés struct(ou union) sont publicpar défaut.

  2. En l'absence d'un spécificateur d'accès pour une classe de base, publicest supposé lorsque la classe dérivée est déclarée structet privateest supposé lorsque la classe est déclarée class.

  3. Vous pouvez déclarer un enum classmais pas un enum struct.

  4. Vous pouvez utiliser template<class T>mais pas template<struct T>.

Notez également que la norme C ++ vous permet de déclarer un type en tant que a struct, puis de l'utiliser classlors de la déclaration du type et vice-versa. Aussi, std::is_class<Y>::valueest truepour Y étant un structet un class, mais est falsepour un enum class.

Bathsheba
la source
belle réponse, bien qu'il me manque un 0 clair et clair) la différence entre structet classen c ++ est une différence entre les mots clés, pas entre les types de données (ou une meilleure alternative;)
idclev 463035818
@ formerlyknownas_463035818: Mais ne pensez-vous pas que cela std::is_class<Y>::valuecouvre cela?
Bathsheba
Ouais, je pensais juste que cela pourrait être plus important, parce que c'est le malentendu commun et une fois que c'est à l'écart, le reste n'est que des corollaires.
idclev 463035818
Peu importe
4

La différence entre classet structest une différence entre les mots clés, pas entre les types de données. Ces deux

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

les deux définissent un type de classe. La différence des mots clés dans ce contexte réside dans les différents accès par défaut:

  • foo::x est public et foo_base hérité publiquement
  • bar::xest privé et bar_basehérité en privé
idclev 463035818
la source
2

Voici une bonne explication: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

Donc, une fois de plus: en C ++, une structure est identique à une classe sauf que les membres d'une structure ont une visibilité publique par défaut, mais les membres d'une classe ont une visibilité privée par défaut.

nutario
la source
2

C'est juste une convention. Les structures peuvent être créées pour contenir des données simples, mais évoluer ultérieurement avec l'ajout de fonctions membres et de constructeurs. En revanche, il est inhabituel de voir autre chose que public: l'accès dans une structure.

finnw
la source
2

ISO IEC 14882-2003

9 cours

§3

Une structure est une classe définie avec la clé de classe struct ; ses membres et classes de base (article 10) sont publics par défaut (article 11).

Gregory Pakosz
la source
2

Une autre différence principale concerne les modèles. Pour autant que je sache, vous pouvez utiliser une classe lorsque vous définissez un modèle mais PAS une structure.

template<class T> // OK
template<struct T> // ERROR, struct not allowed here
Stefan Popescu
la source
1
Si vous avez voulu souligner que les structures ne peuvent pas être utilisées comme types généralisés, alors vous avez tort. Et structn'y est pas autorisé uniquement par convention (mieux vaut dire que c'est un classmot - clé qui est utilisé dans un sens différent ici, voir Utiliser «classe» ou «nom de type» pour les paramètres du modèle ).
dma_k
Le mot-clé n'y est pas autorisé, mais vous pouvez passer dans une classe que vous avez définie structtrès bien. Essayez-le. struct T{}; template <typename T> void foo() {} foo<T>();
Courses de légèreté en orbite
1

Les autres réponses ont mentionné les valeurs par défaut privées / publiques (mais notez qu'une structure est une classe est une structure; ce ne sont pas deux éléments différents, juste deux façons de définir le même élément).

Ce qui peut être intéressant à noter (d'autant plus que le demandeur est susceptible d'utiliser MSVC ++ car il mentionne le C ++ "non managé"), c'est que Visual C ++ se plaint dans certaines circonstances si une classe est déclarée avec classpuis définie avec struct(ou peut-être l'inverse) ), bien que la norme le dise parfaitement légal.

ymett
la source
Je sais que c'est un commentaire très tardif, mais sachez que l'avertissement susmentionné n'est pas sans fondement car Windows ABI gère différemment les structures et les classes et, par conséquent, le mélange (en avant) des déclarations de classe et de structure peut en fait rendre difficile la compréhension des problèmes de liaison!
MFH
1
  • . Dans les classes, tous les membres par défaut sont privés, mais dans la structure, les membres sont publics par défaut.

    1. Il n'y a pas de terme comme constructeur et destructeur pour les structures, mais pour le compilateur de classe crée par défaut si vous ne fournissez pas.

    2. La taille de la structure vide est de 0 octet car la classe vide de Sizeof est de 1 octet. Le type d'accès par défaut à la structure est public. Une structure doit généralement être utilisée pour regrouper des données.

    Le type d'accès par défaut de la classe est privé et le mode par défaut pour l'héritage est privé. Une classe doit être utilisée pour regrouper les données et les méthodes qui opèrent sur ces données.

    En bref, la convention consiste à utiliser struct lorsque le but est de regrouper des données et à utiliser des classes lorsque nous avons besoin d'abstraction de données et, peut-être d'héritage.

    En C ++, les structures et les classes sont passées par valeur, sauf si elles sont explicitement dé-référencées. Dans d'autres langues, les classes et les structures peuvent avoir une sémantique distincte, c'est-à-dire. les objets (instances de classes) peuvent être passés par référence et les structures peuvent être passées par valeur. Remarque: Il y a des commentaires associés à cette question. Voir la page de discussion pour ajouter à la conversation.

yshivakathik
la source
3
"2. La taille de la structure vide est de 0 octet car la classe vide de Sizeof est de 1 octet". Faux. Je viens de tester avec g++. Vous pensez peut-être à l'optimisation de la base vide, mais cela s'applique également aux deux.
cdunn2001
1
Pas vrai. En C ++, la taille d'une structure vide est 1. En C, une structure vide n'est pas autorisée. GCC autorise les structures vides en C en tant qu'extension de compilateur et une telle structure a la taille 0.
Johan Råde
Cette réponse est fausse. En plus de la taille, la partie constructeur / destructeur est également inexacte: les structures peuvent avoir des constructeurs et des destructeurs très bien. En fait, structcrée des classes à part entière en C ++.
melpomene
1

Bien qu'impliqué par d'autres réponses, il n'est pas explicitement mentionné - que les structures sont compatibles C, selon l'utilisation; les classes ne le sont pas.

Cela signifie que si vous écrivez un en-tête que vous voulez être compatible C, vous n'avez pas d'autre option que struct (qui dans le monde C ne peut pas avoir de fonctions; mais peut avoir des pointeurs de fonction).

UKMonkey
la source
-1

Vous pouvez considérer cela pour des directives sur le moment où aller pour la structure ou la classe, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .

√ CONSIDÉRER la définition d'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.

X ÉVITEZ de définir une structure sauf si le type possède toutes les caractéristiques suivantes:

Il représente logiquement une valeur unique, similaire aux types primitifs (int, double, etc.).

Il a une taille d'instance inférieure à 16 octets.

C'est immuable.

Il n'aura pas à être emballé fréquemment.

kiriloff
la source
Cela concerne .NET / C #, pas C ++.
melpomene
-2

La classe n'a de sens que dans le contexte du génie logiciel. Dans le contexte des structures de données et des algorithmes, la classe et la structure ne sont pas si différentes. Il n'y a aucune règle restreignant le fait que le membre de la classe doit être référencé.

Lorsque vous développez un grand projet avec des tonnes de personnes sans classe, vous pouvez enfin obtenir du code couplé compliqué car tout le monde utilise les fonctions et les données qu'il souhaite. La classe fournit des contrôles d'autorisation et inhérents pour améliorer le découplage et la réutilisation des codes.

Si vous lisez certains principes d'ingénierie logicielle, vous constaterez que la plupart des normes ne peuvent pas être mises en œuvre facilement sans classe. par exemple: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

BTW, lorsqu'une structure alloue un crunch de mémoire et inclut plusieurs variables, les variables de type valeur indiquent que les valeurs sont incorporées là où la structure est allouée. En revanche, les valeurs des variables de type référence sont externes et référencées par un pointeur qui est également intégré à l'endroit où struct est alloué.

neige
la source
Cette réponse ne semble pas concerner le C ++. En C ++, structdéclare les classes (y compris les contrôles d'autorisation, l'héritage, etc.).
melpomene
-3

La différence entre les mots clés struct et class en C ++ est que, lorsqu'il n'y a pas de spécificateur spécifique sur un type de données composite particulier, alors par défaut struct ou union sont les mots clés publics qui considèrent simplement le masquage des données mais la classe est le mot clé privé qui considère le masquage du programme codes ou données. Certains programmeurs utilisent toujours struct pour les données et la classe pour le code. Pour plus d'informations, contactez d'autres sources.

MOBITI MAHENGE
la source
OP a déjà mentionné que les structmembres sont publics par défaut, et la réponse acceptée de 2009 mentionne l'héritage. Pourquoi écrire une autre réponse qui n'ajoute aucune nouvelle information 4 ans plus tard?
melpomene
-3

De tous ces facteurs, on peut conclure que le concept Classe est très approprié pour représenter des objets du monde réel plutôt que des "Structures". En grande partie parce que les concepts POO utilisés en classe sont très pratiques pour expliquer des scénarios du monde réel, donc plus faciles à fusionner avec la réalité. Par exemple, l'héritage par défaut est public pour les structures, mais si nous appliquons cette règle pour le monde réel, c'est ridicule.Mais dans une classe, l'héritage par défaut est privé, ce qui est plus réaliste.

Quoi qu'il en soit, ce que je dois justifier, c'est que la classe est un concept beaucoup plus large et applicable dans le monde réel, tandis que la structure est un concept primitif avec une mauvaise organisation interne (la structure Eventhough suit les concepts de la POO, ils ont un mauvais sens)

Wageesha
la source
1
Comment l'héritage privé est-il "plus réaliste"? La plupart des langages de programmation n'ont même pas le concept d'héritage privé.
melpomene
-3

La principale différence entre la structure et le mot clé de classe dans oops est qu'aucune déclaration de membre public et privé n'est présente dans la structure et que la fonction membre et membre de données peut être définie comme publique, privée et protégée.

Tushar Bobade
la source
Cette réponse ne semble pas concerner le C ++. En C ++, structdéclare les classes (y compris public/ private/ protected, l'héritage, etc.).
melpomene
-3

** MISE À JOUR: ** Veuillez ignorer cette réponse. Je n'ai pas considéré la possibilité que pour la structure, la valeur n'était pas initialisée mais se trouvait juste être 0. Il n'y a pas de différence d'initialisation entre la structure et la classe.


Je vois une autre différence entre les structures et les classes liées à l'initialisation par défaut.

struct Foo {
    int a;
};

class Bar {
    int a;
};

class Tester {
    Foo m_Foo = Foo();
    Bar m_Bar = Bar();

public:
    Tester() {}
};

int main() {
    auto myTester = Tester();
}

Exécutez ce code et examinez myTester. Vous constaterez que pour m_Foo, la structure, m_Foo.a a été initialisée à 0, mais pour m_Bar, la classe, m_Bar.a n'est pas initialisée. Il semble donc qu'il y ait une différence dans ce que le constructeur par défaut fait pour struct vs classe. Je vois cela avec Visual Studio.

Eric Hill
la source
1
Comment avez-vous déterminé que cela m_Foo.aavait été initialisé? Et si elle n'était pas initialisée et se trouvait juste être 0?
melpomene
Uhhh, je ne l'ai pas fait. Ma faute. Ce n'est pas une différence entre struct et classe. Les caractéristiques d'initialisation sont les mêmes.
Eric Hill
-4

La principale différence entre struct et classe est que dans struct, vous ne pouvez déclarer que des variables de données de différents types de données tandis qu'en classe, vous pouvez déclarer des variables de données, des fonctions membres et ainsi vous pouvez manipuler des variables de données via des fonctions.

-> une autre chose pratique que je trouve dans la classe vs struct est que lors de l'implémentation de fichiers dans un programme si vous souhaitez effectuer plusieurs opérations d'une structure encore et encore sur chaque nouvel ensemble d'opérations, vous devez créer une fonction distincte et vous devez passer l'objet de struct après l'avoir lu dans le fichier afin de faire quelques opérations dessus. en classe si vous créez une fonction qui effectue à chaque fois des opérations sur les données nécessaires ... c'est facile, il vous suffit de lire l'objet à partir du fichier et d'appeler la fonction.

Mais cela dépend du programmeur de quelle manière il / elle trouve approprié ... selon moi, je préfère la classe à chaque fois juste parce qu'il prend en charge les POO et c'est la raison pour laquelle il est implémenté dans presque toutes les langues et c'est la merveilleuse caractéristique de la programmation de tous les temps; - )

Et oui, la différence la plus inoubliable que j'ai oublié de mentionner est que la classe prend en charge le masquage des données et prend également en charge les opérations qui sont effectuées sur des types de données intégrés tandis que struct ne fonctionne pas!

Yug Rawal
la source
1
En C ++ structpeut avoir des fonctions membres
chtz
@chtz Merci ... j'ai appris à propos de cette fonctionnalité tout à l'heure .. merci beaucoup .. je suis juste un débutant pas aussi expert que vous, donc à l'avenir vous aurez également besoin des conseils de vous:
Yug Rawal
et en fait, la fonction de membre doit être conçue dans son sens le plus large. structpeut avoir des constructeurs, une fonction membre et un distracteur (éventuellement virtuel, éventuellement privé, protégé ou public). Ils peuvent hériter et être hérités. donc en fait ... tout ce qu'une classe peut avoir. une convention typique est de déclarer avec struct ce que vous auriez déclaré comme struct en C, et comme classe si nous déclarons variable privée et protégée, fonctions virtuelles, ctor et dtor, etc. Mais ce n'est qu'une convention, non imposée par la langue
Gian Paolo
-5

J'ai trouvé une autre différence. si vous ne définissez pas de constructeur dans une classe, le compilateur en définira un. mais dans une structure si vous ne définissez pas de constructeur, le compilateur ne définit pas non plus de constructeur. donc dans certains cas où nous n'avons vraiment pas besoin d'un constructeur, struct est un meilleur choix (astuce performance). et désolé pour mon mauvais anglais.

Ali
la source
4
Ce n'est pas vrai. Il n'y a pas de différence entre une classe définie avec le structmot - clé et une classe définie avec le classmot - clé à cet égard.
ymett
quand j'utilise une structure sans constructeur, j'obtiens une meilleure vitesse qu'une classe sans constructeur.
Ali
@Ali Non, non.
Courses de légèreté en orbite le
-5

Les classes sont des types de référence et les structures sont des types de valeurs.
Quand je dis que les classes sont des types de référence,
elles contiennent essentiellement l'adresse d'une variable d'instance.

Par exemple:

Class MyClass
{
    Public Int DataMember;  //By default, accessibility of class data members 
                            //will be private. So I am making it as Public which 
                            //can be accessed outside of the class.
}

Dans la méthode principale,
je peux créer une instance de cette classe en utilisant un nouvel opérateur qui alloue de la mémoire pour cette classe
et stocke l'adresse de base de celle-ci dans la variable de type MyClass (_myClassObject2).

Static Public void Main (string[] arg)
{
    MyClass _myClassObject1 = new MyClass();
    _myClassObject1.DataMember = 10;

    MyClass _myClassObject2 = _myClassObject1;
    _myClassObject2.DataMember=20;
}

Dans le programme ci-dessus, MyClass _myClassObject2 = _myClassObject1; indique que les deux variables de type MyClass

  1. myClassObject1
  2. myClassObject2

et pointera vers le même emplacement mémoire.
Il affecte fondamentalement le même emplacement de mémoire dans une autre variable du même type.

Donc, si des modifications que nous apportons à l'un des objets, tapez MyClass aura un effet sur un autre
puisque les deux pointent vers le même emplacement de mémoire.

"_myClassObject1.DataMember = 10;" sur cette ligne, les deux membres de données de l'objet contiendront la valeur de 10.
"_myClassObject2.DataMember = 20;" sur cette ligne, le membre de données de l'objet contient la valeur de 20.
Finalement, nous accédons aux membres de données d'un objet via des pointeurs.

Contrairement aux classes, les structures sont des types de valeur. Par exemple:

Structure MyStructure
{
    Public Int DataMember;  //By default, accessibility of Structure data 
                            //members will be private. So I am making it as 
                            //Public which can be accessed out side of the structure.
}

Static Public void Main (string[] arg)
{
    MyStructure _myStructObject1 = new MyStructure();
    _myStructObject1.DataMember = 10;

    MyStructure _myStructObject2 = _myStructObject1;
    _myStructObject2.DataMember = 20;
}

Dans le programme ci-dessus,
instanciation de l'objet de type MyStructure à l'aide d'un nouvel opérateur et
stockage de l'adresse dans la variable _myStructObject de type MyStructure et
affectation de la valeur 10 au membre de données de la structure à l'aide de "_myStructObject1.DataMember = 10".

Dans la ligne suivante,
je déclare une autre variable _myStructObject2 de type MyStructure et j'assigne _myStructObject1 à cela.
Ici, le compilateur .NET C # crée une autre copie de l'objet _myStructureObject1 et
affecte cet emplacement mémoire dans la variable MyStructure _myStructObject2.

Donc, quel que soit le changement que nous effectuons sur _myStructObject1, il n'aura jamais d'effet sur une autre variable _myStructObject2 de type MyStructrue.
C'est pourquoi nous disons que les structures sont des types de valeur.

Ainsi, la classe de base immédiate pour la classe est Object et la classe de base immédiate pour Structure est ValueType qui hérite de Object.
Les classes prendront en charge un héritage, contrairement aux structures.

Comment dit-on cela?
Et quelle est la raison derrière cela?
La réponse est Classes.

Il peut être abstrait, scellé, statique et partiel et ne peut pas être privé, protégé et protégé en interne.

Abhishek Sharma
la source
4
Je pense que cela essaie de répondre à la question pour c #? La question concerne le c ++, et cela rend cette réponse inexacte, non?
smw
@smw absolument, il a écrit son exemple de code en C # et je suis venu ici pour vérifier qu'il n'y avait pas de différence de passage de paramètres entre C ++ structet class. Personne ici ne l'a mentionné, ni l'ensemble du Web. Je ne pense donc pas que cela s'applique au C ++ non plus.
John
Ce n'est même pas un code C # valide - les mots clés sont tous faux. "Public", "Static", "Int" et "Class" ne doivent pas être mis en majuscule et doivent être "struct" et non "Structure". La description est surtout précise pour C # (bien que les structures puissent toujours hériter des interfaces, mais pas d'autres structures), mais ne répond pas à la question car il s'agissait de C ++ ...
Darrel Hoffman
2
Cette réponse est complètement absurde. Il utilise un étrange mélange de Visual Basic et C # pour ses exemples de code, et l'ensemble "Les classes sont des types de référence et les structures sont des types de valeurs" ... La chose ne s'applique qu'à .NET (c'est-à-dire C #) et non à C ++. Tu es dans la mauvaise pièce, mec. C'est là que vous appartenez: stackoverflow.com/questions/13049
TheFlash
Mais cette réponse indique que la même chose est valable pour C (++), que les structures sont utilisées comme des types de valeur. int a = 3; int b = a;et similaireMyStruct a=MyStruct("data"); MyStruct b = a;
luckydonald
-8

Il y a 3 différences fondamentales entre la structure et la classe

La mémoire 1St- est réservée à la structure en mémoire de pile (qui est proche du langage de programmation), que la classe en mémoire de pile soit réservée à la référence seule et la mémoire réelle est réservée en mémoire de tas.

2Nd - Par défaut, la structure traite comme un public si la classe est considérée comme un privé.

3Rd- ne peut pas réutiliser le code dans la structure mais en classe, nous pouvons réutiliser le même code dans de nombreux temps appelé héritage

Naveen
la source
2
Les structures C ++ prennent en charge l'héritage et les méthodes abstraites. La structure et la classe sont réparties de la même manière. L'allocation de classe sur le tas même si elles ne sont pas instanciées avec un "nouveau" n'a pas de sens pour les systèmes embarqués.
JCMS
2
# 1 est également faux. La pile est utilisée lorsque vous déclarez quelque chose de ce type en tant que variable locale et le tas est utilisé lorsque vous utilisez l'opérateur "new".
Score_Under