504 votes

Constructeur de structure en C++ ?

Est-ce qu'un struct ont un constructeur en C++ ?

J'ai essayé de résoudre ce problème mais je n'arrive pas à obtenir la syntaxe.

16voto

GManNickG Points 155079

Oui. Une structure est identique à une classe, mais elle a la valeur par défaut suivante public: dans la définition de la classe et lors de l'héritage :

struct Foo
{
    int bar;

    Foo(void) :
    bar(0)
    {
    }
}

En ce qui concerne votre autre question, je vous suggère de lire quelques tutoriels . Ils répondront à vos questions de manière plus rapide et plus complète que nous.

16voto

Steve L Points 252

Notez qu'il existe une différence intéressante (au moins avec le compilateur MS C++) :


Si vous avez une structure ordinaire à la vanille comme celle-ci

struct MyStruct {
   int id;
   double x;
   double y;
} MYSTRUCT;

alors quelque part ailleurs vous pourriez initialiser un tableau de tels objets comme ceci :

MYSTRUCT _pointList[] = { 
   { 1, 1.0, 1.0 }, 
   { 2, 1.0, 2.0 }, 
   { 3, 2.0, 1.0 }
};

Cependant, dès que vous ajoutez un constructeur défini par l'utilisateur à MyStruct, comme ceux discutés ci-dessus, vous obtenez une erreur comme celle-ci :

    'MyStruct' : Types with user defined constructors are not aggregate
     <file and line> : error C2552: '_pointList' : non-aggregates cannot 
     be initialized with initializer list.

C'est donc au moins une autre différence entre une structure et une classe. Ce type d'initialisation n'est peut-être pas une bonne pratique OO, mais il apparaît partout dans le code c++ de l'ancien WinSDK dont je m'occupe. Pour votre information...

0 votes

Cela semble être un comportement incorrect de la part du compilateur (en supposant que l'option class déclare ses membres comme public ). MS dit "Visual C++ n'autorise pas les types de données dans un agrégat qui contient des constructeurs" mais n'indique pas pourquoi cela ne s'appliquerait pas également aux classes. Et cela semble fonctionner dans VS 2015.

0 votes

Fonctionne bien avec les derniers bits de VS 2017 Preview 4 également. Version de l'API 141

0 votes

Donc Aluan, vous dites que VS2017 permet maintenant la liste des initialisateurs pour les structs avec constructeurs ? Je n'ai pas encore essayé l'aperçu... Merci !

15voto

SwDevMan81 Points 22634
struct HaveSome
{
   int fun;
   HaveSome()
   {
      fun = 69;
   }
};

Je préfère initialiser dans le constructeur pour ne pas avoir à conserver l'ordre.

0 votes

Les membres sont toujours initialisés dans l'ordre dans lequel ils apparaissent dans le corps de la classe/structure. La création d'affectations dans le corps du constructeur n'est que cela... des affectations.

13voto

heavyd Points 8845

Oui, les structures et les classes en C++ sont les mêmes, sauf que les membres des structures sont publics par défaut alors que les membres des classes sont privés par défaut. Tout ce que vous pouvez faire dans une classe, vous devriez pouvoir le faire dans une structure.

struct Foo
{
  Foo()
  {
    // Initialize Foo
  }
};

0 votes

Le genre de chose créée par le mot-clé struct est une classe .

7voto

Rajesh Thakur Points 1

Oui, il est possible d'avoir un constructeur dans une structure, voici un exemple :

#include<iostream.h> 
struct a {
  int x;
  a(){x=100;}
};

int main() {
  struct a a1;
  getch();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X