Un constructeur de copie est un constructeur avec une signature spécifique. Il prend un seul paramètre, de const référence au même type en cours de construction. Donc, pour un class Foo
, le constructeur de copie ressemble à ceci:
Foo::Foo(const Foo&)
Il y a 2 autres types de constructeurs: par défaut et convertir. Le constructeur par défaut ne prend pas des paramètres (ou peut être appelé comme si elle n'a pas pris de paramètres, par exemple, tous les paramètres par défaut ont):
Foo::Foo()
... et le destructor convert est fondamentalement autre chose. Par exemple:
Foo::Foo(const Bar&)
pourquoi le constructeur de copie être appelé?
Dans votre cas, vous appelez un constructeur RailwayLineLink
mais en passant dans une référence const à un RailwayLine
, de sorte que vous appelez en fait un constructeur de conversion, pas un constructeur de copie.
Le constructeur de conversion est appelé parce que vous l'avez appelé:
new RailwayLineLink(data);
Ceci construit un nouvel objet RailwayLineLink
, en passant data
comme le seul et seul paramètre au constructeur.
Si vous avez un constructeur de convertir vide, qui ressemble à quelque chose comme ceci:
RailwayLineLink::RailwayLineLink(const RailwayLine&)
{
}
... alors tous les membres de la nouvelle copie sera construite par défaut, et contiennent probablement des déchets.
En général, lorsque vous implémentez un constructeur de copie, vous voulez faire une sorte de copie de l'original de membre à membre à la copie, comme ceci:
RailwayLineLink::RailwayLineLink(const RailwayLine& rhs)
: value_(rhs.value_)
{
}
Salut, bienvenue à StackOverflow. À l'avenir, lorsque vous écrivez du code, vous devez le mettre en évidence et cliquer sur le bouton avec le code binaire; Cela le formatera pour qu'il apparaisse correctement. :-) –
Sans voir le constructeur 'RailwayLineLink' que vous utilisez, c'est difficile à dire, mais ça ressemble à" parce que vous l'avez demandé ". Mettez un point d'arrêt sur le constructeur de copie vide (quelle classe interrogez-vous, au fait?) Et vérifiez la callstack pour être sûr. –
@Platinum Azure: WTF ?!J'ai ajouté des espaces manuellement à chaque ligne de code que j'ai écrit !! ; ( – BlackBear