====Initialisation d'un membre dans la déclaration vs dans le constructeur==== C'est la même chose. La valeur dominante sera celle définie dans le constructeur. int show(int i) { std::cout << "i" << i << std::endl; return 1; } class Something { public: int m_a = 0; Something() : // Ici, la valeur n'aura pas été préalablement initialisée à 0. m_a(show(m_a)) { } }; int main() { Something smh; std::cout << smh.m_a << std::endl; } Valeur affichée : i-858993460 1 ====Ordre de l'initialisation des membres par la liste du constructeur==== L'ordre d'initialisation des membres sera celui de la déclaration de la classe et non pas celui de la liste. class A { public: int j; int* i; A(int* i_) :i(i_), j(*i) {} }; int main() { int i = 0; A a(&i); } En more ''Debug'' (sans optimisation), à l'exécution, on aura : Exception levée : violation d'accès en lecture. this->**i** a été nullptr. ====Faire échouer un constructeur/ Faire renvoyer nullptr à un constructeur==== Non, c'est impossible de faire échouer proprement un constructeur ou de renvoyer ''nullptr'' pour tester le code de retour. Le seul moyen de faire échouer un constructeur est de générer une exception. L'autre solution est de créer un constructeur vide (ou avec le minimum) puis d'appeler une fonction d'initialisation qui sera autorisée à échouer et enfin détruire la classe si besoin. ====Les exceptions dans un destructeur==== C'est interdit. Par défaut, les constructeurs non ''noexcept''. Si une exception est générée, cela génère un ''abort()''. [[https://akrzemi1.wordpress.com/2011/09/21/destructors-that-throw/|Destructors that throwDestructors that throw]] {{ :lang:cpp:constructeur:destructors_that_throw_andrzej_s_c_blog_2019-12-18_23_39_00_.html |Archive du 21/09/2011 le 18/12/2019}}