2012-01-12 4 views
2

Je suis un peu confus sur ce qui arrive si je fais ce qui suit:Explication du code de simple constructeur

class a{ 
    int i; 
public: 
    a(){} 
}; 

class b: public a{ 
}; 

int main(){ 
    b b1; 
} 

Depuis la classe b n'a pas de constructeur, ce constructeur est-il utilisé? Utilise-t-il le constructeur par défaut de a? Ou son propre compilateur en a généré un?

Répondre

1

Puisque la classe b n'a pas de constructeur, quel constructeur utilise-t-elle? Utilise-t-il le constructeur par défaut d'un? Ou son propre compilateur en a généré un?

Ceci est un peu plus compliqué que cela puisse paraître au premier abord.

En termes de C++ Standard, les classes obtiennent des constructeurs générés par le compilateur sans arguments lorsque le programmeur ne spécifie pas explicitement un constructeur. Conceptuellement, b obtient un tel constructeur par défaut qui à son tour invoque le constructeur de a. À un autre niveau, dans un compilateur d'optimisation, aucun des deux constructeurs n'a à faire quoi que ce soit - ils peuvent (ou ne peuvent pas) être complètement éliminés et «ne pas exister» même en tant que fonction vide. Donc - à ce niveau - parler du constructeur de b appelant le constructeur de a est juste un non-sens.

À mon humble avis, il est important de comprendre les deux aspects.

1

La classe b aura un constructeur généré par le compilateur, qui appellera à son tour le constructeur de a.

4

Il possède un constructeur par défaut "defaulted" (argument nul) généré par le compilateur et un constructeur de copie "defaulted" généré par le compilateur. Il a également un constructeur de déplacement "par défaut" généré par le compilateur, si votre compilateur le supporte.

1

class b aura un constructeur par défaut généré par le compilateur. Parce que b hérite a, la commande va d'abord construire a, puis b.

5

Deux constructeurs seront appelés - le premier constructeur a pour l'initialisation de la classe de base, puis le constructeur b. Puisque vous n'avez pas défini de constructeur pour b, le compilateur en a généré un par défaut. Comme votre classe b n'a aucun membre à construire, ce constructeur par défaut sera vide.