2009-05-18 16 views
6

En lisant les réponses à cette question j'ai eu un doute concernant la construction par défaut des objets dans le vecteur. Pour le tester, j'ai écrit le code de test suivant:Construction par défaut des éléments dans un vecteur

struct Test 
{ 
    int m_n; 

    Test(); 

    Test(const Test& t); 

    Test& operator=(const Test& t); 
}; 

Test::Test() : m_n(0) 
{ 
} 

Test::Test(const Test& t) 
{ 
    m_n = t.m_n; 
} 

Test& Test::operator =(const Test& t) 
{ 
    m_n = t.m_n; 
    return *this; 
} 


int main(int argc,char *argv[]) 
{ 
    std::vector<Test> a(10); 
    for(int i = 0; i < a.size(); ++i) 
    { 
     cout<<a[i].m_n<<"\n"; 
    } 

    return 0; 
} 

Et bien sûr, le test struct constructeur par défaut est appelé lors de la création de l'objet vectoriel. Mais ce que je ne suis pas capable de comprendre est comment la STL initialise les objets que je crée un vecteur de type de données de base tel que le vecteur d'ints puisqu'il y a un constructeur par défaut pour cela? c'est-à-dire, comment toutes les valeurs du vecteur ont-elles la valeur 0? Ne devrait-il pas être une poubelle?

Répondre

10

Il utilise l'équivalent du constructeur par défaut pour ints, qui est de les initialiser à zéro. Vous pouvez le faire explicitement:

int n = int(); 

sera mis à zéro. Notez que la construction par défaut n'est utilisée et requise que si le vecteur a une taille initiale. Si vous avez dit:

vector <X> v; 

il n'y a aucune exigence que X ait un constructeur par défaut.

+0

Il semble y avoir beaucoup de temps à la main, aujourd'hui :) – xtofl

+0

C'est la joie de la récession :-( –

+0

Je ne savais pas que .. Eh bien qu'est-ce que nous appelons int() comme? Et puis pourquoi ne pas Nous avons des initialiseurs par défaut pour les types de données de base – Canopus

1
std::vector<Type> a(10);  // T could be userdefined or basic data type 

Vector appelle essentiellement default pour le type auquel il fait remarquer: Type()

  • si elle est le type de données de base comme int, deux sont là alors int(), double() {int () obtiendra la valeur 0}
  • si le type de données défini par l'utilisateur, puis constructeur par défaut serait appelé.