Pourquoi faut-il que le constructeur de copie reçoive son paramètre par référence?
Réponses
Trop de publicités?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".)
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.
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.