A primeira forma significa que o (estado do) Circleobjeto 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 Circlepor meio dessa referência que não sejam qualificadas como const.
A segunda forma, por outro lado, é ilegal: apenas funções-membro podem ser constqualificadas (enquanto o que você está declarando lá é uma friendfunção global ).
Quando constqualifica uma função de membro, a qualificação se refere ao thisargumento 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 thisponteiro implícito ) - com exceção dos mutableobjetos, 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;
};