Question

 Vector(const Vector& other) // Copy constructor 
 {
    x = other.x;
    y = other.y;

Pourquoi l'argument est-il un const?

Était-ce utile?

La solution

Vous avez obtenu des réponses indiquant que le cteur ne pouvait pas changer ce qui était copié - et ils ont raison, le fait de leur indiquer le même effet a bien cet effet.

Plus important cependant, un objet temporaire ne peut pas se lier à une référence non const. Le copieur doit prendre une référence à un objet const pour pouvoir faire des copies d’objets temporaires.

Autres conseils

Parce que vous n'allez pas modifier l'argument other à l'intérieur du ctor de copie tel quel.

Quand vous avez fait x = other.x , cela signifie essentiellement this- > x = other.x . Ainsi, vous ne modifiez que cet objet simplement en copiant les valeurs de autre . Puisque la variable other est en lecture seule ici, elle est passée en tant que const-ref.

Le copieur / copieur traditionnel et ses amis utilisent un paramètre const & amp; pour les raisons indiquées ci-dessus. Cependant, vous devriez également rechercher move-sémantique et références de valeur r (pour faire partie de C ++ 0x, si tout se passe bien) pour voir pourquoi et quand vous utiliserez des copy-ctors sans paramètre const & amp; . Un autre endroit à considérer est la mise en œuvre de pointeurs intelligents tels que auto_ptr (qui ont une sémantique de transfert de propriété) où les paramètres non const sont utiles.

Pour ne pas pouvoir changer autre (par accident)?

lorsque nous essayons de copier un objet dans un autre à l'aide du constructeur de copie, nous devons conserver la copie d'origine de l'objet original (que nous copions). Ainsi, lorsque vous transmettez un objet, nous le rendons constant et nous le transmettons par référence.

L'idée d'un constructeur de copie est que vous copiez le contenu de l'objet other dans l'objet this . Le const est là pour vous assurer que vous ne modifiez pas l'objet other .

Ce n'est pas spécifique au constructeur de copie. Dans n'importe quelle fonction, si vous n'allez pas modifier l'état interne de l'objet, l'objet sera transmis sous la forme const .

Vector(const Vector& other) 
{
     //Since other is const, only public data member and public methods which are `const` can be accessed.
}

Cela peut également s'avérer utile si vous souhaitez copier un objet pour lequel vous ne disposez que d'une référence const, par exemple

.
...
const Vector& getPosition();
...

Vector* v = new Vector(getPosition());

S'il n'y avait pas Vector (vecteur const et autre) , cet exemple créerait une erreur de syntaxe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top