2010-04-27 7 views
1

Est-il possible de faire en sorte que le compilateur crée les constructeurs par défaut même si je fournis un constructeur explicite? Parfois, je les trouve très utiles, et je trouve que c'est une perte de temps pour écrire, par exemple. le constructeur de copie, en particulier pour les grandes classes.Comment puis-je faire en sorte que le compilateur crée les constructeurs par défaut en C++?

+0

Je ne comprends pas la question. cette classe triviale 'class MyClass {public: int i;};' a un ctor par défaut, copy ctor et dtor. –

+2

@Binary Worrier: "même si je fournis moi-même un constructeur explicite". Si vous avez donné à 'MyClass' un constructeur' int', il n'aura plus de constructeur par défaut sans argument. –

+0

Ceci est vrai, j'ai été loin de C++ pour * loin * trop longtemps. Excuses. –

Répondre

2

Le constructeur de copie est fourni si vous définissez d'autres constructeurs ou non. Tant que vous ne déclarez pas de constructeur de copie, vous en obtenez un.

Le constructeur sans argument n'est fourni que si vous ne déclarez pas de constructeur. Vous n'avez donc pas de problème à moins de vouloir un constructeur sans argument, mais considérez que c'est une perte de temps d'en écrire un.

IIRC, C++ 0x a un moyen de déléguer la construction à un autre constructeur. Je ne peux pas me souvenir des détails, mais cela vous permettrait de définir un constructeur sans arg en spécifiant un autre constructeur, plus le ou les arguments à lui passer. Peut-être sauver la saisie de certains initialiseurs de membre de données dans certains cas. Mais le constructeur par défaut sans arg n'a pas non plus fourni ces initialiseurs.

3

Vous ne pouvez pas - le compilateur désactive une partie de son constructeur par défaut généré automatiquement lorsque vous fournissez le vôtre, de sorte que vous pouvez empêcher la construction par défaut de certaines classes de cette façon. Cependant, je pense que C++ 0x vous permettra d'indiquer explicitement une implémentation du compilateur par défaut, par exemple:

MyClass() = default; // 'delete' also allowed by upcoming standard to disable 

Je ne pense pas que les compilateurs soutiennent ce encore - C++ 0x (comme la norme suivante a été connu) n'est pas encore définitif, donc vous devrez juste faire dactylographier vos constructeurs par défaut pour l'instant. Ce n'est pas beaucoup de code! MyClass() {} fera aussi longtemps que tous les membres sont eux-mêmes constructibles par défaut.

+0

Pourriez-vous ajouter des références? – qdii

1

Le compilateur génère toujours le constructeur de copie par défaut, sauf si vous fournissez votre propre définition de constructeur de copie. Votre problème est uniquement avec le constructeur par défaut sans argument, qui n'est pas généré s'il existe une définition de constructeur. Mais ce n'est pas si difficile de fournir sans arg constructeur qui se comporte exactement comme un produit:

class yourClass 
{ 
    public: 
     yourClass(){} 
} 
+0

Je pense que vous voulez mettre public: au-dessus du constructeur au lieu de comme un mot-clé de style Java/C#. – AshleysBrain

+0

Je parlais plutôt du constructeur de copie ... qui est un peu plus de code si vous avez beaucoup de propriétés. –

+0

@AshleyBrain @Itay Moav: merci. Je travaille en Java maintenant donc mes habitudes changent :-) –

Questions connexes