¿Por qué el argumento copiar-constructor es const?

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

¿Por qué el argumento es const?

Obtuviste respuestas que mencionan que el codificador no puede cambiar lo que se está copiando, y tienen razón, poner el conflicto allí sí tiene ese efecto.

Más importante, sin embargo, es que un objeto temporal no puede vincularse a una referencia no constante. El copiador debe tomar una referencia a un objeto const para poder hacer copias de objetos temporales.

Porque no va a modificar el argumento other dentro del copiador ya que es const.

Cuando hiciste x = other.x esencialmente significa this->x = other.x . Entonces está modificando solo this objeto simplemente copiando los valores de other variable. Como la other variable es de solo lectura aquí, se pasa como un const-ref.

El copiador tradicional y sus amigos toman una configuración const& parámetro por las razones especificadas anteriormente. Sin embargo, también debería buscar las referencias move-semántica y r-value (para ser parte de C ++ 0x, si todo va bien) para ver por qué y cuándo usará copy-ctors sin const& parámetro. Otro lugar para observar es la implementación de punteros inteligentes como auto_ptr (que tienen semántica de transferencia de propiedad) donde los parámetros no const son útiles.

Para no poder cambiar el other (por accidente)?

cuando intentamos copiar un objeto en otro usando el constructor de copia, necesitamos mantener la copia original del objeto original (que estamos copiando), de modo que al pasar el objeto lo hacemos constante y lo pasamos por referencia.

La idea de un constructor de copia es que está copiando el contenido del other objeto en this objeto. El const está ahí para garantizar que no modifiques el other objeto.

No es específico para copiar el constructor. En cualquier función si no va a modificar el estado interno del objeto, entonces el objeto se pasará como const .

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

También puede ser útil si quiere copiar un objeto con el que solo tiene una referencia constante, por ejemplo

 ... const Vector& getPosition(); ... Vector* v = new Vector(getPosition()); 

Si no fuera por Vector(const Vector& other) ese ejemplo crearía un error de syntax.