Perché l'argomento del costruttore della copia è const?
-
05-07-2019 - |
Domanda
Vector(const Vector& other) // Copy constructor
{
x = other.x;
y = other.y;
Perché l'argomento è una const?
Soluzione
Hai ottenuto risposte che menzionano assicurando che il ctor non può cambiare ciò che viene copiato - e hanno ragione, mettendo la const lì ha quell'effetto.
Più importante, tuttavia, è che un oggetto temporaneo non può essere associato a un riferimento non const. Il copiatrice deve prendere un riferimento a un oggetto const per poter fare copie di oggetti temporanei.
Altri suggerimenti
Perché non modificherai l'argomento altro
all'interno del ctor della copia poiché è const.
Quando hai fatto x = other.x
significa essenzialmente this- > x = other.x
. Quindi stai modificando solo questo
semplicemente copiando i valori dalla variabile other
. Poiché la variabile other
è di sola lettura qui, viene passata come const-ref.
Il copiatore e gli amici tradizionali accettano un parametro const & amp;
per i motivi sopra specificati. Tuttavia, dovresti anche cercare move-semantics e riferimenti di valore r (per far parte di C ++ 0x, se tutto va bene) per vedere perché e quando userete copy-ctors senza un parametro const & amp;
. Un altro posto da guardare è l'implementazione di puntatori intelligenti come auto_ptr
(che hanno il trasferimento della semantica della proprietà) dove sono utili parametri non cost.
Per non poter cambiare altro
(per caso)?
quando proviamo a copiare un oggetto in un altro utilizzando il costruttore di copie, dobbiamo mantenere la copia originale dell'oggetto originale (che stiamo copiando), quindi durante il passaggio dell'oggetto lo rendiamo costante e lo passiamo come riferimento.
L'idea di un costruttore di copie è che stai copiando il contenuto dell'oggetto altro
nell'oggetto this
. La const è lì per assicurarti di non modificare l'oggetto altro
.
Non è specifico per il costruttore di copie. In qualsiasi funzione se non si intende modificare lo stato interno dell'oggetto, l'oggetto verrà passato come const
.
Vector(const Vector& other)
{
//Since other is const, only public data member and public methods which are `const` can be accessed.
}
Può anche tornare utile se vuoi copiare un oggetto a cui hai solo un riferimento const ad esempio
...
const Vector& getPosition();
...
Vector* v = new Vector(getPosition());
Se non fosse per Vector (const Vector & amp; altro)
quell'esempio creerebbe un errore di sintassi.