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
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.
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.
C'est interdit. Par défaut, les constructeurs non noexcept
. Si une exception est générée, cela génère un abort()
.
Destructors that throwDestructors that throw Archive du 21/09/2011 le 18/12/2019