Outils pour utilisateurs

Outils du site


lang:cpp:constructeur

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
lang:cpp:constructeur [2019/07/10 15:44] – Création avec "Initialisation d'un membre dans la déclaration vs dans le constructeur" rootlang:cpp:constructeur [2019/12/18 23:49] (Version actuelle) – Ajout de "Les exceptions dans un destructeur" root
Ligne 6: Ligne 6:
 int show(int i) int show(int i)
 { {
-   std::cout << "i" << i << std::endl; +  std::cout << "i" << i << std::endl; 
-   return 1;+  return 1;
 } }
  
Ligne 13: Ligne 13:
 { {
 public: public:
-   int m_a = 0; +  int m_a = 0; 
-   Something() : +  Something() : 
-      m_a(show(m_a)) +    // Ici, la valeur n'aura pas été préalablement initialisée à 0. 
-   +    m_a(show(m_a)) 
-   }+  
 +  }
 }; };
  
 int main() int main()
 { {
-   Something smh; +  Something smh; 
-   std::cout << smh.m_a << std::endl;+  std::cout << smh.m_a << std::endl;
 } }
 </code> </code>
Ligne 31: Ligne 32:
   i-858993460   i-858993460
   1   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.
 +
 +<code cpp>
 +class A
 +{
 +public:
 +  int j;
 +  int* i;
 +  A(int* i_) :i(i_), j(*i) {}
 +};
 +
 +int main()
 +{
 +  int i = 0;
 +  A a(&i);
 +}
 +</code>
 +
 +En more ''Debug'' (sans optimisation), à l'exécution, on aura :
 +
 +<code>
 +Exception levée : violation d'accès en lecture.
 +this->**i** a été nullptr.
 +</code>
 +
 +====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}}
lang/cpp/constructeur.1562766259.txt.gz · Dernière modification : 2019/07/10 15:44 de root