133 votes

Pourquoi le constructeur de copie devrait-il accepter son paramètre par référence en C ++?

Pourquoi faut-il que le constructeur de copie reçoive son paramètre par référence?

200voto

GManNickG Points 155079

Parce que si ce n'est pas par référence, c'est par valeur. Pour ce faire, faites une copie et appelez le constructeur de copie. Mais pour faire cela, nous devons créer une nouvelle valeur, nous appelons donc le constructeur de copie, et ainsi de suite ...

(Vous auriez une récursion infinie parce que "pour faire une copie, vous devez en faire une copie".)

71voto

Brian Roach Points 43787

Parce que valeur par passage invoquerait le constructeur de copie :)

24voto

Potatoswatter Points 70305

L'alternative au passage par référence est passé par valeur. Passage par valeur est vraiment passé par copie. Le constructeur de copie est nécessaire pour en faire une copie.

Si vous aviez à faire une copie juste d'appeler le constructeur de copie, ce serait une énigme.

(Je pense que la récursivité infinie se ferait dans le compilateur et que vous n'auriez jamais réellement obtenir un tel programme.)

En plus rationnelle des raisons, c'est interdit par la norme dans le §12.8/3:

Une déclaration d'un constructeur pour un la classe X est mal formé et si son premier le paramètre est de type (éventuellement cv- qualifié) de X et soit il n'y a pas de d'autres paramètres, sinon tous les autres les paramètres ont des arguments par défaut.

14voto

Romain Hippeau Points 16175

Il serait infiniment récursif si vous le passiez par valeur

8voto

Sriraman Points 11

chaque fois que vous appelez une fonction (exemple: int f(voiture c)) qui prend ses arguments autres que des types de données intégrés (ici voiture) une exigence pour copier l'objet réel fourni par l'appelant à la variable dans la fonction appelée paramètre.
exemple: voiture carobj; f(carobj);

c'est, copier carobj c.

carobj doivent être traités de paramètre c en fonction de f.

Pour réaliser la copie, le constructeur de copie est appelé.

Dans ce cas, la fonction f a appelé à l'aide le passage par valeur ou en d'autres termes, la fonction f est déclaré à prendre le passage par valeur.

Si la fonction f prend en passer par, sa déclaration est de type int f(voiture &c);

Dans ce cas, la voiture carobj; f(carobj); n'a pas besoin d'un constructeur de copie.

Dans ce cas, c devenu alias de carobj.

À l'aide de ces 2 scénarios, pour votre clarté, je suis un résumé: 1. Si une fonction déclarée à prendre un paramètre comme valeur d'un objet, puis constructeur de copie de l'objet est appelé. 2. Si une fonction déclarée à prendre un paramètre que le passage par référence, le paramètre devenir un alias de l'objet fourni par l'appelant. Pas besoin de constructeur de copie!

Maintenant, la question est pourquoi le passage par référence est nécessaire. Si le constructeur de copie accepte de référence, la réception de la variable devenir des alias de l'objet fourni. Donc, pas besoin de constructeur de copie (dans ce cas, appel à lui-même) pour copier la valeur en appelant objet fourni au constructeur de copie de la variable dans la liste d'arguments.

Sinon, si le constructeur de copie prend de l'appelant objet fourni comme valeur, c'est à dire le passage par valeur, puis il besoin d'un constructeur de copie de l'objet donné; par conséquent, pour obtenir l'objet fourni de l'appelant dans notre fonction elle-même (dans ce cas constructeur de copie) nous avons besoin d'appeler le constructeur de copie, qui n'est rien mais l'appel de la même fonction durant les paramètres de la fonction d'initialisation de lui-même. C'est la raison de l'adoption d'une référence au constructeur de copie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X