Die erste Form bedeutet, dass das (Status des) Circle
Objekts, das an die Referenz gebunden ist, die der Parameter der copy()
Funktion ist, copy()
durch diese Referenz nicht geändert wird . Die Referenz ist eine Referenz auf const
, daher ist es nicht möglich, Mitgliedsfunktionen von Circle
über diese Referenz aufzurufen , die selbst nicht als qualifiziert sind const
.
Die zweite Form ist dagegen illegal: Nur Mitgliedsfunktionen können qualifiziert werden const
(während das, was Sie dort deklarieren, eine globale friend
Funktion ist).
Wenn const
eine Mitgliedsfunktion qualifiziert wird, bezieht sich die Qualifikation auf das implizite this
Argument. Mit anderen Worten, diese Funktion darf den Status des Objekts, auf das sie aufgerufen wird (das Objekt, auf das der implizite this
Zeiger zeigt), nicht ändern - mit Ausnahme von mutable
Objekten, aber das ist eine andere Geschichte.
Um es mit Code zu sagen:
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;
};