Quand avons-nous besoin d'un constructeur par défaut?
Ma question est simple. Quand avons-nous besoin d'avoir un constructeur par défaut?
Veuillez consulter le code ci-dessous:
class Shape
{
int k;
public:
Shape(int n) : k(n) {}
~Shape() {}
};
class Rect : public Shape
{
int l;
public:
Rect(int n): l(n)
{} //error C2512: 'Shape' : no appropriate default constructor available
~Rect() {}
};
- Pourquoi le compilateur ne génère pas l'argument zero constructeur par défaut de manière implicite dans la classe Rect?
- Selon mes connaissances, si une classe (Rect) est dérivée d'une autre classe (la Forme) qui a constructeur par défaut (soit générées implicitement ou explicitement prévu), le constructeur par défaut devrait être généré par le compilateur.
source d'informationauteur XMarshall
Vous devez vous connecter pour publier un commentaire.
Un constructeur par défaut n'est pas synthétisée si vous avez créé votre propre constructeur avec arguments. Depuis que vous avez donné
Shape
un constructeur de votre propre, vous devez écrire explicitement un défautShape
constructeur maintenant:(Vous pouvez laisser le vide
~Rect() {}
définitions, car ceux-ci seront synthétisées.)Cependant, il me semble que vous n'avez pas voulez un constructeur par défaut pour la Forme ici. Ont
Rect
construire leShape
de base correctement:Également noter que cet exemple est souvent cité comme un abus de OO. Demandez-vous si vous vraiment besoin d'héritage ici.
Un constructeur par défaut ne seront générées automatiquement par le compilateur si pas d'autres constructeurs sont définis. Indépendamment de tout héritage.
Et aussi vous avez besoin pour construire votre classe de base en appelant le:
Voir ce pour la totalité des comportements de C++ WRT constructeurs: http://en.wikipedia.org/wiki/Default_constructor
La réponse est simple, si vous spécifiez un constructeur, le compilateur ne créer une valeur par défaut pour vous.
Cette règle s'applique à Java.
Le compilateur va définir une valeur par défaut ctor si et seulement si vous n'avez pas explicitement déclarer toutes les ctors.
Noter que ce qui est important, c'est déclarant le constructeur, pas nécessairement de la définition. Il est assez fréquent, par exemple, pour déclarer un privé ctor, et de ne jamais le définir, pour empêcher le compilateur de implicitement la définition de tous les autres.
Edit: à noter Également que le C++11 a une
=default
syntaxe pour faire face à des situations comme la vôtre.Le constructeur par défaut est généré uniquement si vous n'avez pas défini d'autres constructeurs.
Soi-disant, si vous avez besoin de quelque particulière de l'initialisation de la classe, le constructeur par défaut serait de ne pas faire la bonne chose.
Comme vous avez défini un Constructeur pour la Forme attend un entier vous avez écrasé le constructeur par défaut en le faisant. Donc, si vous étendez la Forme, vous devez passer à une valeur entière à la super-classe.
Compilateur génère un constructeur par défaut dans le cas où vous n'avez pas définir de tout constructeur. Mais si vous avez défini tout constructeur qui prend un argument ou pas. Le compilateur utilisera que constructeur et ne générera pas de constructeur par défaut, zéro argument.