Domanda

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

Perché l'argomento è una const?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top