Outils pour utilisateurs

Outils du site


lang:cpp:constructeur

Ceci est une ancienne révision du document !


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.
lang/cpp/constructeur.1575059810.txt.gz · Dernière modification : 2019/11/29 21:36 de root