Outils pour utilisateurs

Outils du site


lang:cpp:constructeur

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().

Destructors that throwDestructors that throw Archive du 21/09/2011 le 18/12/2019

lang/cpp/constructeur.txt · Dernière modification : 2019/12/18 23:49 de root