La prima forma significa che lo (stato Circledell'oggetto ) legato al riferimento che è il parametro della copy()funzione non sarà alterato da copy()quel riferimento. Il riferimento è un riferimento a const, quindi non sarà possibile invocare funzioni membro di Circletramite quel riferimento che non sono a loro volta qualificate come const.
La seconda forma, d'altra parte, è illegale: solo le funzioni membro possono essere constqualificate (mentre quello che stai dichiarando è una friendfunzione globale ).
Quando constqualifica una funzione membro, la qualifica fa riferimento thisall'argomento implicito . In altre parole, a quella funzione non sarà permesso di alterare lo stato dell'oggetto su cui è invocata (l'oggetto puntato dal thispuntatore implicito ) - ad eccezione degli mutableoggetti, ma questa è un'altra storia.
Per dirlo con il codice:
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;
};