Ссылка - это просто псевдоним объекта.Ссылки формируются по запросу вызываемой функции;они не являются (обязательно) частью типа объекта.Возможно, это вам уже знакомо, но учтите следующее:
void f1(int a) { ++a; }
void f2(int & a { ++a; }
int main()
{
int x = 5;
f1(x);
f2(x);
}
Конечно, вы знаете разницу между этими двумя функциями.Но обратите внимание, что x
всегда является просто объектом типа int
.Передается ли это по ссылке или по значению, это не свойство x
, а скорее функция.
То же самое относится и к типам возвращаемых данных:
int q;
int g1() { return q; }
int & g2() { return q; }
int main()
{
++g2();
++g1(); // error
}
Опять же, q
это просто объект.return q;
возвращает его по значению или по ссылке - это не свойство q
, а функция.g1
создает копию q
, а g2
возвращает ссылку на фактический объект q
(который мы можем увеличивать).(Возвращаемое значение g1
не может быть увеличено именно потому, что оно не имеет постоянного существования, и это было бы бессмысленно (технически это выражение является значением).)
Итак, в вашем примере, return *this;
возвращает ссылку на сам объект.Это не имеет ничего общего с this
, но имеет отношение к тому факту, что возвращаемый тип функции - Message&
.