Je viens de demander this question et les bonnes réponses mentionnées en utilisant une liste d'initialisation. J'ai donc cherché dans plusieurs endroits différents. On a souvent dit que l'on pouvait utiliser une liste d'initialisation pour sélectionner le constructeur à utiliser. Je pensais que toutes les affectations devaient être évitées, alors comment écrire les listes d'initialisation pour ces deux constructeurs?Comment puis-je utiliser une liste d'initialisation pour sélectionner le constructeur à utiliser?
Répondre
Je ne suis pas sûr que je suis. En l'état, en fournissant un argument à x
et y
(et donc z
), les deux constructeurs seront disponibles pour appeler, ce qui entraîne une ambiguïté.
Je pense que ce que vous cherchez est:
class First
{
public:
First(int x);
First(int x, int y, int z = 0);
};
// invoked as First f(1);
First::First(int x) :
a(x), b(0), c(0)
{}
// invoked as First f(1, 2); or First f(1, 2, 3);
First::First(int x, int y, int z) :
a(x), b(y), c(z)
{}
Pourquoi ne pas initialiser c (0) dans le second exemple? J'ai compris que l'utilisation de assignment (int z = 0) était coûteuse, et que la liste d'initialisation était la méthode préférée. –
Je me suis permis de réparer l'utilisation des arguments par défaut. –
@Benoit: Merci. @Peter: Ce n'est pas un devoir, c'est un paramètre par défaut. Il dit "si ce paramètre n'est pas fourni, utilisez cette valeur". Cela n'a rien à voir avec l'affectation, il utilise simplement '=' comme symbole. – GManNickG
La liste d'initialisation de Ctor n'a pas pour but de choisir quel ver de ctor sera choisi.
Mais sera en C++ 0x (constructeurs délégués) ... :) – UncleBens
+1 pour oncle;) –
@Uncle le seul problème que je vois avec toute cette affaire de C++ 0x (pour lequel je ne peux pas attendre!) est-ce que: 1. L'IDE le plus populaire à savoir VS depuis la dernière version ne craint rien (en raison du fait qu'il a été écrit en MJ). 2. Je ne suis pas tout à fait sûr, mais les gars de Microsoft sont probablement plus intéressés par leur propre enfant (MJ) que Bjarne et j'ai peur qu'ils donnent un support complet dans VS2010 pour MJ et C++ est traité comme s'il s'agissait d'un cadeau indésirable ils ont reçu et ne savent pas comment dire qu'ils ne l'aiment pas vraiment (le cadeau que je veux dire.). Donc, quand et si elles implémenter C++ 0x est un grand '?'. –
Ce n'est pas comment les choses fonctionnent. Si vous voulez utiliser des arguments par défaut, n'utilisez qu'une seule construction, déclarez-la avec des arguments par défaut et définissez-la (sans les redéfinir).
class First
{
private:
int a, b, c;
public:
First(int x, int y = 0, int z = 0);
};
First::First(int x, int y, int z)
{ /*...*/ }
Compte tenu de votre question, je ne suis pas sûr que vous savez ce qu'est une liste d'initialisation est ...
oui, je pourrais avoir été hâtive posant cette question. J'ai recherché "l'initialisation", et ai eu beaucoup d'exemples, mais aucune bonne description/explication. Merci –
Je pense que vous voulez dire ceci:
class First
{
private:
int a, b, c;
public:
First(int x);
First(int x, int y);
}
class Second
{
private:
Second(int x) : First(x) { }
Second(int x, int y) : First(x, y) { }
}
Peut-être?
Est-ce le C++ légal ci-dessus? Si je devais utiliser le nouveau First (1, 2, 3), les deux constructeurs ne seraient-ils pas appropriés pour créer un problème? –
Vous confondez les «listes d'initialisation» avec «paramètres par défaut» pour les fonctions ... –
Je suis confus. pouvez-vous recommander une bonne description des listes d'initialisation? –