2010-03-06 4 views
2

Depuis la publication précédente, j'ai appris qu'il y a deux façons, au moins, de déclarer un tableau sans constructeurs par défaut. Comme ceciUne question à propos du tableau sans constructeur par défaut en C++

class Foo{ 
    public: 
    Foo(int i) {}  
}; 
    Foo f[5] = {1,2,3,4,5}; 
    Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)}; 

J'ai également appris que le premier construira l'objet en utilisant le paramètre directement et que le second constructeur de copie est utilisé ici. Cependant, quand je teste le code ci-dessous. Je rends le constructeur de copie privé. Je m'attends à voir la différence de l'utilisation du constructeur de copie. Mais ce n'est pas ce à quoi je m'attendais. Aucune des deux déclarations ne fonctionne.

class Foo{ 
    public: 
    Foo(int i) {}  
    private: 
    Foo(const Foo& f) {} 
}; 
int main(){ 

    Foo f[5] = {1,2,3,4,5}; 
    Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)};  
} 

Quelqu'un peut-il m'expliquer pourquoi cela se produit-il?

+1

@skydoor: Maintenant vous avez posé exactement 100 questions :-) –

Répondre

5

Le premier ne construira pas les objets directement. Il va d'abord construire un Foo temporaire, puis copier le Foo dans l'élément. C'est similaire à votre deuxième moyen. La différence est que votre deuxième façon ne fonctionnera pas avec un constructeur de copie explicit, tandis que votre premier testament. Et inversement, le premier ne fonctionnera pas avec un constructeur explicit en prenant int, alors que le second le fera. Autrement dit, le premier constructeur utilisé dans l'initialisation d'un élément ne doit pas être explicit.

Notez qu'aucune des deux méthodes ne doit être copiée. Mais ils doivent encore vérifier si les constructeurs de copie sont accessibles. Donc, ils doivent se comporter comme-si ils copieraient, mais ils n'ont pas vraiment besoin de faire la copie.