La primera forma significa que el (estado del) Circle
objeto vinculado a la referencia que es el parámetro de la copy()
función no será alterado por copy()
esa referencia. La referencia es una referencia a const
, por lo que no será posible invocar funciones miembro de a Circle
través de esa referencia que no estén calificadas como const
.
La segunda forma, por otro lado, es ilegal: solo las funciones miembro pueden ser const
-calificadas (mientras que lo que está declarando es una friend
función global ).
Cuando const
califica una función miembro, la calificación se refiere al this
argumento implícito . En otras palabras, a esa función no se le permitirá alterar el estado del objeto en el que se invoca (el objeto al que apunta el this
puntero implícito ), con la excepción de los mutable
objetos, pero esa es otra historia.
Para decirlo con código:
struct X
{
void foo() const
{
_x = 42;
_y = 42;
}
void bar(X& obj) const
{
obj._x = 42;
_x = 42;
}
void bar(X const& obj)
{
obj._x = 42;
obj._y = 42;
_x = 42;
}
int _x;
mutable int _y;
};