Перша форма означає, що 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;
};