Quand utiliser une classe vs une struct en C++?

dans quels scénarios est-il préférable d'utiliser un struct vs un class en C++?

747
demandé sur Tamir Vered 2008-09-10 20:29:54

24 réponses

les différences entre un class et un struct en C++ sont que les structures ont par défaut public les membres et les bases et les classes ont par défaut private les membres et les bases. Les deux classes et les structures peuvent avoir un mélange de public , protected et private membres, peut utiliser l'héritage et peut avoir des fonctions de membre.

je recommande d'utiliser les structures comme des structures de données simples et anciennes sans aucune caractéristique de classe, et d'utiliser les classes comme structure des données agrégées avec private données et fonctions des membres.

642
répondu Commodore Jaeger 2018-06-30 06:23:37

comme tout le monde le fait remarquer, il n'y a en réalité que deux différences linguistiques:

  • struct par défaut à l'accès public et class par défaut à l'accès privé.
  • en cas d'héritage, struct par défaut à public en cas d'héritage et class par défaut à private en cas d'héritage. (Ironiquement, comme avec tant de choses en C++, le défaut est à l'envers: public l'héritage est de loin le plus commun choix, mais les gens déclarent rarement struct s juste pour économiser sur dactylographier le " public " mot clé.

mais la vraie différence dans la pratique est entre un class / struct qui déclare un constructeur/destructeur et un qui ne le fait pas. Il y a certaines garanties à un POD "plain-old-data" type, qui ne s'appliquent plus une fois que vous prenez en charge la construction de la classe. Pour maintenir cette distinction claire, beaucoup de gens utilisent délibérément seulement struct s pour POD types, et, s'ils vont ajouter des méthodes à tous, utilisez class es. La différence entre les deux fragments ci-dessous n'a pas de sens:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(soit dit en passant, voici un fil avec quelques bonnes explications sur ce que" POD type "signifie réellement: Qu'est-ce que les types de POD en C++? )

178
répondu quark 2017-05-23 11:47:30

Il y a beaucoup d'idées fausses dans les réponses.

"les deux class et struct déclarent une classe.

Oui, il se peut que vous ayez à réorganiser votre accès en modifiant des mots-clés à l'intérieur de la définition de la classe, selon le mot-clé que vous avez utilisé pour déclarer la classe.

mais, au-delà de la syntaxe, la seulement raison de choisir une par rapport à l'autre, il y a convention/style/préférence.

certaines personnes aiment s'en tenir au mot-clé struct pour les classes sans fonctions de membre, parce que la définition résultante "ressemble à" une structure simple de C.

de même, certaines personnes aiment utiliser le mot-clé class pour les classes avec les fonctions de membre et private données, parce qu'il dit "classe" sur elle et ressemble donc à des exemples de leur livre préféré sur la programmation orientée objet.

la réalité est que cela dépend entièrement de vous et de votre équipe, et cela ne fera littéralement aucune différence à votre programme.

les deux classes suivantes sont absolument équivalentes en tous points sauf leur nom:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

vous pouvez même changer de mots-clés lors de la déclaration:

class Foo;
struct Bar;

(bien que certains compilateurs émettent un avertissement lorsque vous faites ceci, sur la supposition que vous n'avez probablement pas l'intention de faire quelque chose d'aussi déroutant et que vous devriez donc être invité à revérifier votre code.)

et les expressions suivantes évaluent toutes deux à true:

std::is_class<Foo>::value
std::is_class<Bar>::value

notez, cependant, que vous ne pouvez pas changer les mots-clés lorsque redéfinir ; c'est seulement parce que (selon la règle d'une définition) dupliquer les définitions de classe à travers la traduction les unités doivent "consister en la même séquence de jetons" . Cela signifie que vous ne pouvez même pas échanger const int member; avec int const member; , et n'a rien à voir avec la sémantique de class ou struct .

100
répondu Lightness Races in Orbit 2018-02-15 12:39:25

le seul moment où j'utilise une struct à la place d'une classe est lorsque je déclare un functor juste avant de l'utiliser dans un appel de fonction et que je veux minimiser la syntaxe pour des raisons de clarté. par exemple:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 
50
répondu Ferruccio 2008-09-10 19:18:58

From the C++ FAQ Lite :

Les membres et les classes de base d'une structure sont publics par défaut, alors que dans la classe, par défaut privé. Note: vous devriez 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 class sont autrement fonctionnellement équivalent.

OK, assez de ce baratin techno. Émotionnellement, la plupart des développeurs font une forte distinction entre une classe et une structure. Une structure se sent simplement comme une pile ouverte de bits avec très peu de manière 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 données publiques (telles choses existent dans bien conçu des systèmes!), mais sinon, vous devriez probablement utiliser le mot-clé class.

31
répondu Tal Pressman 2015-09-10 09:19:07

un endroit où une structure a été utile pour moi est quand j'ai un système qui reçoit des messages de format fixe (sur, par exemple, un port série) d'un autre système. Vous pouvez lancer le flux d'octets en une structure qui définit vos champs, et ensuite facilement accéder aux champs.

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

Évidemment, c'est la même chose que vous feriez en C, mais je trouve que la surcharge d'avoir à décoder le message dans une classe est généralement pas la peine.

20
répondu mbyrne215 2016-12-12 11:15:02

Vous pouvez utiliser "struct" en C++, si vous écrivez une bibliothèque dont les internes sont C++, mais l'API peut être appelé par code C ou C++. Vous créez simplement un en-tête unique qui contient des structures et des fonctions API globales que vous exposez à la fois au code C et c++ comme ceci:

// C access Header to a C++ library
#ifdef __cpp
extern "C" {
#endif

// Put your C struct's here
struct foo
{
    ...
};
// NOTE: the typedef is used because C does not automatically generate
// a typedef with the same name as a struct like C++.
typedef struct foo foo;

// Put your C API functions here
void bar(foo *fun);

#ifdef __cpp
}
#endif

alors vous pouvez écrire une barre de fonction() dans un fichier C++ en utilisant le code C++ et le rendre callable à partir de C et les deux mondes peuvent partager des données à travers la structure déclarée. Il y a d'autres mises en garde. bien sûr quand on mélange C et C++ mais c'est un exemple simplifié.

15
répondu Adisak 2011-09-20 21:53:42

comme chacun le dit, la seule vraie différence est l'accès par défaut. Mais j'utilise surtout struct quand je ne veux pas d'encapsulation avec une classe de données simple, même si j'implémente des méthodes d'aide. Par exemple, quand j'ai besoin de quelque chose comme ceci:

struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};
11
répondu ogoid 2009-07-28 16:13:06
Les structures

( PODs , plus généralement) sont pratiques lorsque vous fournissez une interface C-compatible avec une implémentation C++, car elles sont portables au-delà des frontières de la langue et des formats de linker.

si cela ne vous concerne pas, alors je suppose que l'utilisation de la" structure "au lieu de" classe " est un bon communicateur d'intention (comme @ZeroSignal l'a dit plus haut). Les structures ont aussi une sémantique de copie plus prévisible, donc elles sont utiles pour les données que vous avez l'intention de écrivez aux médias externes ou envoyez par télégramme.

les structures sont également pratiques pour diverses tâches de métaprogrammation, comme les gabarits de traits qui exposent juste un tas de typographies dépendantes:

template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

...Mais c'est juste profiter du fait que le niveau de protection par défaut de struct soit public...

8
répondu argv0 2016-01-31 11:51:44

pour C++, il n'y a vraiment pas beaucoup de différence entre les structures et les classes. La principale différence fonctionnelle est que les membres d'une struct sont publics par défaut, alors qu'ils sont privés par défaut dans les classes. Sinon, autant que de la langue, ils sont équivalents.

cela dit, j'ai tendance à utiliser les structures en C++ comme je le fais en C#, similaire à ce que Brian a dit. Les structures sont des conteneurs de données simples, tandis que les classes sont utilisées pour les objets qui ont besoin d'agir sur les données en plus de simplement tenir à elle.

7
répondu Andy 2008-09-10 16:36:00

pour répondre à ma propre question (sans vergogne), comme déjà mentionné, les privilèges d'accès sont la seule différence entre eux en C++.

j'ai tendance à utiliser une structure pour le stockage de données. Je lui permettrai d'obtenir quelques fonctions d'aide si cela facilite le travail avec les données. Toutefois, dès que les données nécessitent un contrôle du flux (c'est-à-dire getters/setters qui maintiennent ou protègent un état interne) ou commencent à accéder à n'importe quelle fonctionnalité majeure (essentiellement plus semblable à un objet), il sera "mis à niveau" à une classe pour mieux communiquer l'intention.

5
répondu Alan Hinchcliffe 2008-09-10 16:50:18

Ils sont à peu près la même chose. Grâce à la magie du C++, une structure peut contenir des fonctions, utiliser l'héritage, créé en utilisant "new" et ainsi de suite comme une classe

La seule différence fonctionnelle est qu'une classe commence avec des droits d'accès privés, tandis qu'une struct commence avec le public. C'est le maintien de la compatibilité avec C.

en pratique, j'ai toujours utilisé des structures comme supports de données et des classes comme objets.

4
répondu enigmatic 2008-09-10 16:36:17

de la Classe.

Les membres du groupe

sont privés par défaut.

class test_one {
    int main_one();
};

est équivalent à

class test_one {
  private:
    int main_one();
};

donc si vous essayez

int two = one.main_one();

nous obtiendrons une erreur: main_one is private parce qu'il n'est pas accessible. Nous pouvons résolvez-le en l'initialisant en spécifiant son public ie

class test_one {
  public:
    int main_one();
};

Struct.

une structure est une classe où les membres sont public par défaut.

struct test_one {
    int main_one;
};

Signifie main_one est privé, c'est à dire

class test_one {
  public:
    int main_one;
};

j'utilise des structures pour les structures de données où les membres peuvent prendre n'importe quelle valeur, c'est facile de cette façon.

3
répondu Frrank 2017-11-12 00:09:18

ils sont la même chose avec des défauts différents (privé par défaut pour class , et public par défaut pour struct ), donc en théorie ils sont totalement interchangeables.

donc, si je veux juste empaqueter quelques informations pour me déplacer, j'utilise une structure, même si j'y mets quelques méthodes (mais pas beaucoup). Si c'est un surtout-opaque, où l'utilisation principale serait par l'intermédiaire des méthodes, et non pas directement aux membres de données, j'utilise une classe complète.

2
répondu Javier 2009-07-28 03:49:00
Les structures

par défaut ont un accès public et les classes par défaut ont un accès privé.

personnellement j'utilise des structures pour des objets de transfert de données ou comme des objets de valeur. Lorsqu'il est utilisé comme tel, je déclare tous les membres comme const pour éviter toute modification par un autre code.

2
répondu anio 2009-07-28 03:51:02

techniquement les deux sont les mêmes en C++ - par exemple il est possible pour une structure d'avoir des opérateurs surchargés etc.

Toutefois :

j'utilise des structures lorsque je souhaite transmettre des informations de plusieurs types simultanément J'utilise des cours quand je m'occupe d'un objet" fonctionnel".

J'espère que ça aidera.

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

par exemple, je renvoie un élève de struct dans l'get...() les méthodes ici - profiter.

1
répondu Maciek 2009-07-28 04:42:17

quand choisiriez - vous d'utiliser struct et quand utiliser class en C++?

j'utilise struct pour définir functors et POD . Sinon, j'utilise class .

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};
1
répondu AraK 2009-07-28 20:40:22

j'utilise des structures quand j'ai besoin de créer un type de POD ou un functor.

1
répondu ivan.ukr 2016-09-15 09:30:25

un avantage de struct sur class est qu'il sauve une ligne de code, si adhérant à"d'abord membres publics, puis privés". Dans cette lumière, je trouve le mot-clé class inutile.

Voici une autre raison pour utiliser seulement struct et jamais class . Certaines directives de style de code pour C++ suggèrent d'utiliser de petites lettres pour les macros de fonction, la raison étant que lorsque la macro est convertie en fonction inline, le nom ne devrait pas avoir besoin de être changé. Même ici. Vous avez votre belle style C struct et un jour, vous découvrez que vous devez ajouter un constructeur, ou certains convenance. Vous le changez en class ? Partout?

faire la distinction entre struct s et class es est juste trop de tracas, entrer dans la façon de faire ce que nous devrions faire - programmation. Comme tant de problèmes de C++, il découle du fort désir de compatibilité ascendante.

1
répondu Vorac 2017-12-10 09:49:59

j'utilise struct seulement quand j'ai besoin de tenir certaines données sans aucune fonction de membre associée à elle (pour fonctionner sur les données de membre) et d'accéder aux variables de données directement.

Eg: lecture / écriture de données à partir de fichiers et de flux socket, etc. Passer des arguments de fonction dans une structure où les arguments de fonction sont trop nombreux et la syntaxe de fonction semble trop longue.

techniquement, il n'y a pas de grande différence entre la classe et la struture sauf défaut d'accessibilité. Plus sur cela dépend du style de programmation comment vous l'utilisez.

0
répondu harik 2009-07-28 04:29:10

je recommande de ne pas mélanger struct s et class es.

Comme d'autres l'ont souligné

  • les deux sont équivalents sauf pour la visibilité par défaut
  • il y a peut être des raisons d'être obligé d'utiliser l'un ou l'autre pour quelque raison que ce soit

sauf si vous êtes forcé, allez avec seulement struct s ou seulement class es parce qu'il vous protège des problèmes cryptiques de linker avec coût zéro .

si vous faites suivre sth. comme class X; et plus tard le Définir comme struct X { ... } il peut fonctionner sur certains linkers (par exemple, g++) et peut échouer sur d'autres (par exemple, MSVC), donc vous vous trouverez dans developer hell. Comme il n'y a aucune raison de mélanger struct et class , pourquoi devrait-on penser plus compliqué et se soucier de savoir si cette chose était un class ou struct ?

0
répondu pasbi 2018-09-17 11:05:27

j'ai pensé que les structures ont été conçues comme une Structure de données (comme un tableau d'information de type multi-données) et les classes ont été intégrées pour L'empaquetage de Code (comme les collections de sous-Programmes et les fonctions)..

: (

-3
répondu GaiusSensei 2009-07-28 04:07:59

Je n'utilise jamais" struct " en C++.

Je ne peux jamais imaginer un scénario où vous utiliseriez une structure quand vous voulez des membres privés, à moins que vous essayiez délibérément d'être confus.

il semble que l'utilisation de structures soit plus une indication syntaxique de la façon dont les données seront utilisées, mais je préfère juste faire une classe et essayer de rendre cela explicite dans le nom de la classe, ou à travers des commentaires.

E. G.

class PublicInputData {
    //data members
 };
-5
répondu Baltimark 2008-09-10 18:02:25

les fonctions D'accès ne sont pas la seule différence entre les structures et les classes. Une structure est meilleure pour les types POD (Plain Old Data), car elle est plus facile à gérer pour le compilateur et le programmeur. Pour les débutants qui n'utilisent pas la programmation orientée objet, l'utilisation d'une structure est très bien.

-6
répondu Eitan Myron 2014-02-21 18:58:36