2010-07-28 8 views
1

Le constructeur défini par le compilateur est vide et n'initialise pas les variables membres. Alors pourquoi le compilateur en crée-t-il un?Pourquoi avons-nous besoin d'un constructeur défini par le compilateur?

Quelle est la différence entre un constructeur défini par le compilateur et un constructeur vide défini par l'utilisateur?

+4

Quel manuel C++ utilisez-vous qui ne l'explique pas? –

+0

Le constructeur généré par le compilateur initialise les membres en appelant leurs constructeurs par défaut dans l'ordre de déclaration de ces membres. Pour les non-POD, cela signifie le constructeur, tandis que pour POD, l'action dépend de la façon dont l'objet est initialisé. –

+0

@Neil: toujours avec le sarcasme. Votez pour cela :) – Bruce

Répondre

5

La présence ou l'absence d'un constructeur affecte la façon dont les utilisateurs de la classe peuvent instancier l'objet. Si le compilateur n'a pas créé de constructeur par défaut, vous ne pourrez pas utiliser de classe ou de struct si vous n'avez pas créé votre propre constructeur.

1

Java spécifique

Si vous ne définissez pas un constructeur pour une classe, un constructeur par défaut est sans paramètre créé automatiquement par le compilateur. Le constructeur par défaut appelle le constructeur parent par défaut (super()) et initialise toutes les variables d'instance à la valeur par défaut (zéro pour les types numériques, null pour les références d'objet et false pour les booléens).

Si vous définissez un constructeur pour votre classe, aucun constructeur par défaut n'est créé automatiquement.

+0

Cette explication est particulièrement liée aux constructeurs par défaut Java! – SPatil

+0

Les variables d'instance ne fonctionnent pas comme ça en C++ –

+0

Ya cette chose est certainement pas vrai pour C++! – SPatil

0

Vous n'avez donc pas besoin d'écrire un constructeur vide lorsque vous n'en avez pas besoin.

Un constructeur défini par le compilateur est toujours public et non explicite. Vous pouvez personnaliser votre constructeur vide en le rendant explicite ou privé si vous le souhaitez.

2

Le ctor défini par le compilateur doit initialiser les variables membres en utilisant les facteurs par défaut pour les types de ces variables. Seuls les membres POD restent non initialisés. Notez également que lorsque/si vous utilisez l'héritage, le ctor travaille en conjonction avec des cteurs de classe de base pour créer l'objet.

Lorsque vous définissez vous-même un ctor, cela empêche le compilateur de générer d'autres cteurs pour vous. Par exemple, si vous avez quelque chose comme:

struct X { 
    int a; 
public: 
    X(int) {} 
}; 

int main() { 
    X x; // error: no default ctor defined 
    X x = X(3); // no problem. 
} 

Le fait que vous avez défini une cteur qui prend un argument int signifie que le compilateur pas générer un cteur par défaut pour vous, de sorte que le X x; ne sera pas work - vous besoin de soit pour spécifier un argument int (qui sera ignoré) ou bien définir un ctor par défaut pour la classe. Si vous commentez le ctor défini ci-dessus, puis le compilateur générera un ctor par défaut, donc le X x; fonctionnera.

0

Tous les compilateurs ne créent pas un constructeur par défaut qui réinitialise les membres de données. J'utilise actuellement un couple qui n'initialise pas les membres de données avec des constructeurs defualt.

Il se trouve que les deux principaux compilateurs sur la plupart des principaux systèmes feront l'initialisation (VS 2010, gcc sous Windows, Linux, Free BSD, Solaris)

0

Le comportement est le même. La seule raison de créer explicitement un constructeur par défaut est quand vous avez également besoin de créer un autre constructeur en plus du constructeur par défaut qui serait normalement créé par le compilateur. Le compilateur ne créera pas un constructeur par défaut si vous créez explicitement un constructeur, que ce constructeur soit ou non un constructeur par défaut.

Questions connexes