2013-03-28 10 views
0

quelqu'un pourrait-il s'il vous plaît expliquer la syntaxe de l'extrait suivant d'un modèle de classe C++?s'il vous plaît expliquer cette syntaxe C++

public: 
explicit Foo(size_t ratio = 500) 
    :list(Bar<I>()) 
    ,vec(Bar<iterator>()) 
    ,n(0), r(ratio){} 

J'ai bonne expérience avec la programmation et à comprendre la plupart des concepts, mais la syntaxe derrière cela est tellement étranger à moi, je ne peux pas le comprendre. I est le type générique. Plus précisément, je ne suis pas sûr de ce que l'explicite est en train de faire ici, en plus de ce qui se passe quand on va exécuter du code tel que Foo<int> myfoo;.

merci!

+1

Ceci répond à ce qui est explicite bien: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

+0

Vous avez besoin de [Le Guide Book définitif et la liste C++] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?rq=1). Veuillez en sélectionner plusieurs. –

Répondre

1

Ceci est un constructeur pour la classe Foo, mais je suis sûr que vous le saviez déjà.

explicit indique que ce constructeur doit recevoir un argument de size_t. C'est-à-dire, on ne peut pas passer dans tout ce qui serait implicitement casté à un type size_t (ex: int).

Le reste des choses font partie de initializer list de constructeur, ce qui signifie que le constructeur initialise le membre de données list avec Bar<I>(), etc.

4

Le mot-clé explicit fait en sorte que votre constructeur n'est pas pris dans le cadre en tant qu'utilisateur séquence de conversion définie pour effectuer des conversions implicites lors de l'initialisation de la copie avec une valeur de type size_t.

Sans le mot-clé explicit, par exemple, tous les éléments suivants seraient valables:

Foo<int> bar(Foo<int> f) 
{ 
    return 0; // OK 
} 

Foo<int> f = 1729; // OK 
bar(42); // OK 

Déclarant votre constructeur comme explicit empêche les initialisations ci-dessus de la compilation.


Ce qui suit la signature du constructeur est un initialization list, et il est utilisé pour construire les sous-objets de la classe de base et sous-objets membres de données de votre classe avant que le corps de votre constructeur est entré.

Lorsque vous faites et non utilisez une liste d'initialisation, les membres de données de votre classe sont construits par défaut. Toutefois, cela peut ne pas être une option si votre classe a des membres de données const ou des membres de données de type référence ou des membres de données d'un type de classe qui n'ont pas de constructeur par défaut.

+0

Maintenant, qu'est-ce que ': list',' Bar ',', n (0), ', et' r (ratio) {} '? Tu veux écrire un livre? :-) –

+0

@BoPersson: Personne ne le publierait :) –

0

Ceci est la définition d'un constructeur pour Foo. Le constructeur est explicit, ce qui signifie qu'il ne sera pas impliqué dans les conversions implicites. À titre d'exemple considérer:

void bar(Foo); 
bar(10); // Error - would require an implicit conversion 

Marquer un constructeur comme explicit empêche ces conversions.

Tout ce qui suit : est une liste d'initialisation de membre. Il liste les membres de Foo par leurs noms et les parenthèses contiennent les expressions avec lesquelles les initialiser. Par exemple, list sera initialisé avec l'objet temporaire créé par Bar<I>(), n est initialisé avec 0, etc.

Questions connexes