2017-07-24 3 views
4

Pourquoi ces deux scénarios (l'initialisation de A et de C) produisent-ils différents résultats d'initialisation par défaut dans C++ 14? Je ne comprends pas le résultat sur la base des règles d'initialisation par défaut dans cppreference.comTypes d'initialisation par défaut C++

struct A { int m; }; 
struct C { C() : m(){}; int m; }; 

int main() { 
    A *a, *d; 
    A b; 
    A c{}; 
    a=new A(); 
    d=new A; 
    cout<<a->m<<endl; 
    cout<<d->m<<endl; 
    cout<<b.m<<endl; 
    cout<<c.m<<endl; 
    cout<<"--------------------"<<endl; 
    C *a1, *d1; 
    C b1; 
    C c1{}; 
    a1=new C(); 
    d1=new C; 
    cout<<a1->m<<endl; 
    cout<<d1->m<<endl; 
    cout<<b1.m<<endl; 
    cout<<c1.m<<endl; 
} 

Sortie:

(Scenario 1) 
    0 
    -1771317376 
    -1771317376 
    0 
    -------------------- 
(Scenario 2) 
    0 
    0 
    0 
    0 

Le poste qui tente d'expliquer cela (mais ce n'est pas clair pour moi encore pourquoi la différence dans les résultats et ce qui provoque l'initialisation de m dans chaque scénario): Default, value and zero initialization mess

+0

Pourriez-vous fournir la page cppreference.com à laquelle vous faites référence? –

+0

votre nom est si confus – bolov

+0

@JohnathanGross J'ai mis à jour le message original avec un lien vers un article qui cite les parties pertinentes de cppreference – darkThoughts

Répondre

-1

AA n'a aucun constructeur défini par l'utilisateur, donc un constructeur par défaut a été généré. C a un constructeur défini par l'utilisateur, donc il n'y a aucune garantie qu'un constructeur par défaut a été généré, d'autant plus que le constructeur défini par l'utilisateur surcharge le constructeur par défaut. Il est presque certain que chaque construction de C utilisait le constructeur défini par l'utilisateur.

Dans le constructeur défini par l'utilisateur pour C utilise une liste d'initialisation à la valeur initialiser C::m. Lorsque C::m est initialisé, il est initialisé en valeur, ce qui inclut une initialisation zéro.

new A; et A b; sont des initialisations par défaut. Cela n'attribue aucune valeur à leurs membres. Quelle valeur est stockée dans A::m est un comportement indéfini.

new A(); et A c{}; sont des initialisations de valeur. Dans le cadre de l'initialisation de la valeur, il effectue une initialisation zéro.

+2

"C a un constructeur défini par l'utilisateur, donc il n'y a aucune garantie qu'un constructeur par défaut a été généré". En fait, il y a une garantie que le constructeur par défaut ne sera pas implicitement généré. – bolov