Un constructeur par défaut.
Il a des paramètres zéro (ou tous ses paramètres par défaut ont), de sorte qu'un objet peut être construite sans aucun paramètre.
Si vous ne définissez pas constructeurs le compilateur va générer un constructeur par défaut pour vous.
Le compilateur généré constructeur par défaut fait (dans l'ordre suivant)
- Appelez le constructeur par défaut de toutes les classes de base (le cas échéant, mais dans l'ordre).
- Appelez le constructeur par défaut de chaque membre (dans l'ordre ils sont déclarés dans la classe).
- Si le membre est un int/flotteur/char etc est indéfini.
- Si le membre est un pointeur, il n'est pas défini.
Le constructeur de copie:
Si vous ne définissez pas un constructeur de copie alors le compilateur génère un constructeur de copie par défaut. Le compilateur
constructeur de copie générer fait (dans l'ordre suivant)
- Appelez le constructeur de copie de toutes les classes de base (le cas échéant, mais dans l'ordre).
- Appelez le constructeur de copie de chaque membre (dans l'ordre dans lequel ils sont déclarés dans la classe).
- Chaque élément est passé à l'élément correspondant de l'objet en cours de copie.
- Remarque pour les pointeurs cela signifie simplement copier la valeur du pointeur.
C'est pourquoi nous obtenons le problème de la copie superficielle lorsque la classe contient un pointeur RAW que l'objet gère.
Bien que pas un constructeur. Il est important de noter que le compilateur générera automatiquement l'opérateur d'assignation quand celui-ci n'est pas défini.
Le compilateur généré opérateur d'affectation fait (dans l'ordre suivant)
- Appelez le opérateur d'affectation de chaque classe de base (le cas échéant, mais dans l'ordre).
- Appelez l'opérateur d'affectation de chaque membre (dans l'ordre où ils sont déclarés dans la classe).
- Chaque élément est passé à l'élément correspondant de l'objet en cours de copie.
- Remarque pour les pointeurs cela signifie simplement copier la valeur du pointeur.
C'est pourquoi nous obtenons le problème de la copie superficielle lorsque la classe contient un pointeur RAW que l'objet gère.
Le Destructeur par défaut:
La plupart des gens pensent que le destructor est trivial ou non. Mais il est important de noter ce que fait la version par défaut (c'est légèrement plus que rien).
- Chaque membre a son destructor appelé (en inverse ordre de déclaration)
- Remarque int/flotteur/pointeurs ne sont pas si Destructeurs est rien fait explicite.
- Chaque destructeur de classe de base est appelé dans l'ordre inverse.
Si vous définissez un destructeur, le comportement ne change pas. Mais le code que vous définissez dans le cadre du destructeur est exécuté avant le comportement défini ci-dessus. Donc en affect il y a toujours un destructeur juste le code est un bloc vide.
Remarque: Il existe des considérations spéciales lorsque des classes de base virtuelles sont utilisées. Mais c'est une autre question. Par conséquent, même si vous définissez une classe vide.
Le compilateur génère toujours quatre méthodes pour vous.
class X: public Z
{
int a;
Y b;
Z* c;
};
// Compiler generated methods will look like this:
X::X()
:Z() // Construct base class.
//,a?? The default construction of an int does nothing the value is undefined.
,b()
//,c?? The default construction of a pointer does nothing,
{}
X::~X()
{} // Note members are destoyed here
// ~c: Does nothing it is a pointer.
// ~b: destroyes b via Y::~Y()
// ~a: Does nothing as POD has not destructr.
// ~Z(): Destory base class.
X::(X const& rhs)
:Z(rhs)
,a(rhs.a)
,b(rhs.b)
,c(rhs.c)
{}
X& operator=(X const& rhs)
{
Z::operator=(rhs);
a = rhs.a;
b = rhs.b;
c = rhs.c;
return *this;
}
phoenix, merci pour la réponse quelques-uns de ce qui précède sont nouveaux pour moi:) ... mais je voulais savoir pendant la construction de l'objet ... quels sont les trucs que le compilateur fait avant que l'objet complet est créé. votre réponse est après la construction de l'objet. – mahesh
Bien que les références IBM soient généralement bonnes, ce n'est pas une bonne définition: –