L'appel d'une Méthode dans le Constructeur
Herb Sutter mentionne dans un de ses http://www.gotw.ca articles qu'un objet est construit(a valide l'existence) que si le constructeur s'exécute complète.c'est à dire de le mettre dans une façon grossière le contrôle passe au-delà de sa dernière accolade.
Maintenant, considérons le code suivant
class A
{
public:
A()
{
f();
}
void f()
{
cout << "hello, world";
}
};
int main()
{
A a;
}
Maintenant de ce que Herb dit, ne peut-on pas dire que, depuis Un n'est pas entièrement construit à l'intérieur de son constructeur l'Appel de f() dans le constructeur n'est pas valide tant que le "il" ptr n'est pas encore prêt.
Encore, il est en effet valide "présent" à l'intérieur du constructeur et f() est appelée.
Je ne pense pas que l'Herbe est de dire quelque chose d'incorrect... mais suppose que je suis en l'interprétant de manière incorrecte....certains peuvent m'expliquer exactement ce que c'est?
Voici le lien de l'article : http://www.gotw.ca/gotw/066.htm
Il parle d'exceptions de constructeurs. Plus précisément voici l'extrait de ma question:
-Quand la vie de l'objet commencer?
Lors de son constructeur se termine avec succès et retourne normalement. C'est, de contrôle atteint la fin du corps du constructeur ou d'un retour plus rapide à la déclaration.
-Quand la vie de l'objet fin?
Lors de son destructeur commence. C'est, de contrôle atteint le début du destructeur corps.
Point Important ici est que l'état de l'objet avant sa vie commence est exactement la même qu'après sa durée de vie se termine -- il n'y a pas d'objet, période de. Cette observation nous amène à la question clé:
Nous pourrions résumer le C++ constructeur modèle comme suit:
Either:
(a) The constructor returns normally by reaching its end or a return statement, and the object exists.
Or:
(b) The constructor exits by emitting an exception, and the object not only does not now exist, but never existed.
Vous devez vous connecter pour publier un commentaire.
C'est seulement lorsque
f()
est unvirtual
méthode declass A
ou sa hiérarchie d'héritage et vous vous attendez à l'exécution de la résolution pourf()
selon le droit de l'objet. En termes simples,virtual
mécanisme n'est pas un coup de pied dans si la méthode est invoquée à l'intérieur de constructeur.Si
f()
n'est pas une fonction virtuelle, il n'y a pas de mal à l'appeler à partir de constructeur(s), vous savez exactement cef()
n'. Les programmeurs l'habitude de les appeler les méthodes de la classe commeinitialize()
de constructeur(s).Pouvez-vous me donner le lien pour le Herb Sutter de l'article?
Par le programme au moment de l'écoulement entre votre constructeur, l'objet de la mémoire a été allouée et la
this
pointeur est bien valide.Ce que Herb signifie, c'est que l'état de l'objet peut ne pas être entièrement initialisé. En particulier, si vous êtes en train de construire une classe dérivée de
A
, alors que la classe' constructeur n'aura pas été appelé pendant que vous êtes encore à l'intérieur d'Un constructeur.Ceci est important si vous avez virtuel fonctions de membre, étant donné que toute fonction virtuelle dans la classe dérivée ne sera pas exécutée si elle est appelée à partir de l'intérieur d'Un constructeur.
Remarque: il aurait été plus facile avec le exact de l'article, de sorte que nous pourrions avoir un certain contexte
Durée de vie des considérations sont en fait assez compliqué.
Considérant le constructeur d'un objet, il y a deux différents points de vue:
À partir du point de vue externe, la durée de vie d'un objet:
Cela signifie que si vous tentez d'accéder à un objet milieu de la construction ou de la mi-destruction de Mauvaises Choses Arrivent (tm). C'est surtout pertinente pour les programmes multi-thread, mais peut se produire si vous passer des pointeurs de votre objet pour les classes de base... ce qui conduit à...
...le point de vue interne. C'est plus compliqué. Une chose que vous êtes sûr, c'est que la mémoire a été allouée, toutefois parties des objets ne peuvent pas être entièrement initialisé encore (après tout, vous êtes la construction de l'auberge).
L'implication de la durée de vie de ne pas avoir encore commencé est principalement le fait que, si le constructeur de lancer une exception, le destructeur ne sera pas exécutée.
Méfiez-vous des membres de variables qui ne sont pas encore initialisé. Méfiez-vous des fonctions virtuelles: la fonction que vous appelez peut-être pas celui que vous attendez si la fonction est virtuelle et d'un objet dérivé, est créé. Autre que cela, je ne vois pas le problème de l'appel de méthodes à partir du constructeur. En particulier la mémoire de l'objet a déjà été alloué.