Question

Dans quels cas est-il préférable d'utiliser un struct vs un class en C++?

Était-ce utile?

La solution

Les différences entre un class et un struct en C++ sont que des structures ont par défaut public les membres et les bases et les classes 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 les membres peuvent utiliser l'héritage et peut avoir des fonctions membres.

Je vous conseille d'utiliser des structures comme la plaine-vieux-structures de données sans aucune classe comme caractéristiques, et à l'aide de classes de l'agrégation des structures de données private les données et fonctions membres.

Autres conseils

Comme tous les autres notes il n'y a que deux véritables différences de langage:

  • struct par défaut, l'accès du public et class par défaut, l'accès privé.
  • Lorsque vous héritez, struct par défaut public l'héritage et class par défaut private de l'héritage.(Ironiquement, comme avec beaucoup de choses en C++, la valeur par défaut est à l'envers: public l'héritage est de loin le choix le plus commun, mais les gens sont rarement déclarer structjuste pour économiser sur de taper "public"mot-clé.

Mais la vraie différence, dans la pratique, entre un class/struct qui déclare un constructeur/destructeur, et un qui ne l'est pas.Il y a un certain nombre de garanties pour un "bon vieux" données de type POD, qui ne s'applique plus une fois que vous prenez au cours de la classe de la construction.Pour garder cette distinction claire, beaucoup de gens délibérément utiliser uniquement structs pour POD types, et, s'ils vont à ajouter des méthodes à tous, l'utilisation classes.La différence entre les deux fragments ci-dessous est par ailleurs pas de sens:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Soit dit en passant, voici un fil, avec quelques explications sur ce "type POD" signifie en réalité: Quelles sont POD types en C++?)

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

Les deux class et struct déclarer une classe.

Oui, vous pouvez réorganiser votre accès à la modification des mots-clés à l'intérieur de la définition de la classe, en fonction des mots clés que vous avez utilisé pour déclarer la classe.

Mais, au-delà de la syntaxe, de la seulement raison de choisir l'un sur l'autre est de la convention/style/de préférence.

Certaines personnes aiment coller avec le struct mot-clé pour les classes sans fonctions de membre, car la définition de "ressemble" à une structure simple de C.

De même, certaines personnes aiment à utiliser la class mot-clé pour les classes avec les fonctions de membre et de private les données, parce qu'il dit "classe" et, par conséquent, ressemble à des exemples tirés 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 ça va faire littéralement aucune différence que ce soit à votre programme.

Les deux classes suivantes sont absolument équivalentes dans tous les sens, sauf leur nom:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Vous pouvez même passer des mots clés lors de redeclaring:

class Foo;
struct Bar;

(bien que cela rompt avec Visual Studio génère en raison de la non-conformité, de sorte que le compilateur émet un avertissement lorsque vous faites cela.)

et les deux expressions suivantes sont vraies (true):

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

Notez, cependant, que vous ne pouvez pas changer les mots clés lors de l' la redéfinition de;c'est seulement parce que (par une définition de la règle) dupliquer les définitions de classe à travers les unités de traduction doit "se composent de la même séquence de tokens".Cela signifie que vous ne pouvez même pas l'échange const int member; avec int const member;, et n'a rien à voir avec la sémantique de class ou struct.

La seule fois que j'utilise une structure plutôt qu'une classe est lors de la déclaration d'un foncteur droit avant de l'utiliser dans un appel de fonction et souhaitez réduire la syntaxe, par souci de clarté.par exemple:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 

À partir de la 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 faire vos classes de base explicitement public, privé ou protégé, plutôt que de s'appuyer sur les valeurs par défaut.

struct et class sont autrement fonctionnellement équivalent.

OK, assez de cette grinçant propre techno parler.Émotionnellement, la plupart des développeurs de faire une forte distinction entre une classe et une struct.Une struct sent tout simplement comme dans un tas de bits avec très peu dans la voie de l'encapsulation ou la fonctionnalité.Une classe se sent comme une vie responsable et membre de la société des services, une forte encapsulation de la barrière, et d'une interface bien définie.Puisque c'est la connotation, la plupart des gens l'ont déjà fait, vous devriez probablement utiliser le mot-clé struct si vous avez une classe qui a très peu de méthodes et dispose de données publiques (telles choses n'existent pas dans les systèmes conçus!), mais sinon, vous devriez probablement utiliser le mot-clé class.

Un endroit où une structure a été utile pour moi, c'est quand j'ai un système de réception fixe le format des messages (plus de dire, d'un port série) à partir 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.

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++.Il vous suffit de faire un seul en-tête qui contient les structures et mondial fonctions de l'API que vous exposez à la fois le C et le C++ code 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

Ensuite, vous pouvez écrire une fonction bar() dans un fichier C++ à l'aide de C++ code et le rendre appelable à partir de C et les deux mondes peuvent partager des données à travers l'déclaré struct l'.Il y a d'autres mises en garde de cours lors du mélange de C et de C++, mais c'est un exemple simplifié.

Comme chacun le dit, la seule vraie différence est la valeur par défaut de l'accès.Mais j'ai surtout utiliser struct quand je ne veux pas tout type d'encapsulation avec une simple classe de données, même si j'en œuvre de certaines 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;}
};

Les structures (Gousses, plus généralement) sont à portée de main lorsque vous êtes en fournissant un C-interface compatible avec une implémentation C++, car ils sont portable à travers les barrières de la langue et de l'éditeur de liens formats.

Si ce n'est pas une préoccupation pour vous, alors je suppose que l'utilisation de la "struct" au lieu de "classe" est un bon communicateur d'intention (comme @ZeroSignal dit ci-dessus).Les structures ont également de plus en plus prévisible de la copie de la sémantique, de sorte qu'ils sont utiles pour les données que vous l'intention d'écrire sur un support externe ou de l'envoyer à travers le réseau.

Les structures sont également très utiles pour diverses métaprogrammation tâches, comme les traits de modèles de simplement exposer un groupe de dépendants typedefs:

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

...Mais c'est vraiment juste de prendre avantage de la structure par défaut du niveau de protection du public...

Pour le 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 simples conteneurs de données, tandis que les classes sont utilisés pour les objets qui doivent agir sur les données en plus de simplement tenir à elle.

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

J'ai tendance à utiliser une structure pour le stockage de données seulement.Je vais l'autoriser à accéder à quelques fonctions d'assistance si elle rend le travail avec les données plus facilement.Cependant dès que les données exige de contrôle de flux (c'est à diredes getters/setters, que de maintenir ou de protéger un état interne) ou commence acquring toutes les fonctionnalités importantes (en gros, plus d'objet), il sera 'mise à niveau' à une classe afin de mieux communiquer leurs intentions.

Ils sont à peu près la même chose.Grâce à la magie de C++, une structure peut contenir des fonctions, utiliser l'héritage, créé à l'aide de "nouveau" 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.

Dans la pratique, j'ai toujours utilisé des structures comme les détenteurs de données et les classes comme des objets.

Classe.

Les membres de la classe 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 vous obtenez un message d'erreur: main_one is private parce que sa n'est pas accessible.Nous pouvons résoudre par l'initialisation en spécifiant son public ie

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

Struct.

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

struct test_one {
    int main_one;
};

Moyens main_one est privé ie

class test_one {
  public:
    int main_one;
};

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

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

donc, si je veux juste package quelques infos pour se déplacer, j'utilise une structure, même si j'ai mis un peu de méthodes là-bas (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.

Les structures par défaut ont accès public et par défaut, les classes ont accès privé.

Personnellement, j'utilise les structures pour le Transfert de Données des Objets ou des Objets de Valeur.Lorsqu'il est utilisé comme tel, je déclare de tous les membres const pour empêcher toute modification par un autre code.

Un avantage de struct plus class c'est qu'il enregistrer une ligne de code, si adhérant à la "première membres publics, privés".Dans cette lumière, je trouve le mot-clé class inutile.

Voici une autre raison d'utiliser uniquement struct et jamais class.Code style des lignes directrices pour le C++ suggèrent d'utiliser des minuscules pour fonction macros, le raisonnement étant que lorsque la macro est converti à une fonction inline, le nom n'a pas besoin d'ê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.Avez-vous le changer pour un class?Partout?

La distinction entre structs et classes est juste trop de problèmes, à la façon de faire ce que nous devrions faire de programmation.Comme beaucoup de C++de problèmes, il découle de la volonté forte de rétro compatibilité.

Techniquement, les deux sont la même chose en C++, par exemple, il est possible pour un struct avoir surchargé les opérateurs, etc.

Cependant :

J'utilise des structs, quand je veux passer des informations de plusieurs types en même temps J'utilise les classes lors de la je fais face à un "fonctionnelle" de l'objet.

Espérons que cela aide.

#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 suis de retour d'un struct étudiant dans la...() méthodes ici - en profiter.

Quand vous choisissez d'utiliser struct et quand utiliser la classe en C++?

J'utilise struct quand je définis 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; }
};

J'utilise des structs quand j'ai besoin de créer type de POD ou de foncteur.

Tous les membres du groupe sont privées par défaut et tous les membres de la structure sont publics par défaut.Classe a privé par défaut des bases et des Struct a défaut public des bases.Struct dans le cas de C ne peut pas avoir les fonctions membres où, comme dans le cas de C++ on peut avoir les fonctions membres d'être ajoutée à la structure.Outre ces différences, je ne trouve rien d'étonnant à eux.

Comme d'autres l'ont souligné

  • les deux sont équivalent en dehors de 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

Il y a une recommandation claire sur l'utilisation de, qui à partir de Stroustrup/Sutter:

Utilisation de la classe si la classe a un invariant;utiliser struct si les membres de données peut varier de manière indépendante

Cependant, gardez à l'esprit qu'il n'est pas sage de déclarer avant sth.en tant que classe (class X;) et le définir comme struct (struct X { ... }).Il peut travailler sur certains segments de liaison (par exemple, g++) et peut ne pas sur d'autres (par exemple, MSVC), de sorte que vous trouverez vous-même un développeur de l'enfer.

J'utilise struct seulement quand j'ai besoin de tenir des données sans fonctions de membre associé (pour fonctionner sur les données du membre) et d'accéder aux données des variables directement.

Par exemple:Lecture/Écriture de données à partir de fichiers et de la prise ruisseaux etc.En passant les arguments de la fonction dans une structure où les arguments de la fonction sont trop nombreux et la syntaxe de la fonction est trop longue.

Techniquement il n'y a pas de grande différence entre la classe et la struture à l'exception de défaut de l'accessibilité.De plus elle dépend de la programmation de style de la façon dont vous l'utiliser.

Je pensais que les Structures a été conçu comme une Structure de Données (comme une multi-type de données de tableau d'information) et de classes a été inteded pour le Code de l'Emballage (comme les collections de sous-routines et fonctions)..

:(

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

Je ne peux pas imaginer un scénario où vous utiliseriez un struct quand vous voulez privée des membres, sauf si vous êtes volontairement en essayant d'être source de confusion.

Il semble que l'utilisation de structures plus d'un syntaxiques indication de la façon dont les données seront utilisées, mais je préfère juste faire une classe et d'essayer de rendre explicite dans le nom de la classe, ou par le biais des commentaires.

E. g.

class PublicInputData {
    //data members
 };
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top