A primeira forma significa que o (estado do) Circle
objeto vinculado à referência que é o parâmetro da copy()
função não será alterado por copy()
meio dessa referência. A referência é uma referência a const
, portanto, não será possível invocar funções-membro de Circle
por meio dessa referência que não sejam qualificadas como const
.
A segunda forma, por outro lado, é ilegal: apenas funções-membro podem ser const
qualificadas (enquanto o que você está declarando lá é uma friend
função global ).
Quando const
qualifica uma função de membro, a qualificação se refere ao this
argumento implícito . Em outras palavras, essa função não terá permissão para alterar o estado do objeto em que é chamada (o objeto apontado pelo this
ponteiro implícito ) - com exceção dos mutable
objetos, mas isso é outra história.
Para dizer com 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;
};