Первая форма означает, что Circle
объект (состояние), привязанный к ссылке, которая является параметром copy()
функции, не будет изменен copy()
посредством этой ссылки. Ссылка является ссылкой на const
, поэтому Circle
через эту ссылку будет невозможно вызывать функции-члены , которые сами не квалифицируются как const
.
Вторая форма, с другой стороны, является незаконной: только функции-члены могут быть const
квалифицированы (в то время как то, что вы объявляете, является глобальной friend
функцией).
Когда const
квалифицирует функцию-член, квалификация относится к неявному this
аргументу. Другими словами, этой функции не будет разрешено изменять состояние объекта, для которого она вызывается (объект, на который указывает неявный this
указатель) - за исключением mutable
объектов, но это уже другая история.
Чтобы сказать это с помощью кода:
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;
};