this
является const ptr для объекта / экземпляра, который функция-член получает неявно, так как же return *this
возвращает ссылку?
Насколько я знаю, разыменование указателя на переменную означает, что она содержит адрес своей памяти, поэтому return *this
должно возвращать значение, разыменованное этим константным указателем, что к чему? Объект?
Кроме того, почему вы не можете сделать что-то вроде этого:
Calc cCalc;
cCalc.Add(5).Sub(3).Mult(4);
Не имея всех функций-членов return *this
?
Я хотел бы знать, как указатели и ссылки относятся к объектам / экземплярам.
Давайте попробуем распутать:
это const ptr для объекта / экземпляра, который функция-член получает неявно
функции-члены действительно получают этот указатель неявно. Типом является T * или const T * в зависимости от сигнатуры функции-члена — вы получаете const, помещая ключевое слово const в хвост после ().
так как return * возвращает ссылку?
* это разыменование указателя, таким образом создавая lvalue типа T или const T соответственно. Если ваш вопрос подразумевается, как вы получите T& Исходя из этого, в константном ответе, ответом, который вы не сделаете, будет попытка неправильно сформированного кода.
Насколько я знаю, разыменование указателя на переменную означает, что она содержит адрес своей памяти, поэтому return * this должно вернуть значение, разыменованное этим константным указателем, что и что? Объект?
* это обозначает экземпляр. И это lvalue выражение. Таким образом, вы можете получить его адрес agan (предоставив такой же, как этот), или можете привязать его к ссылке — включая случай возврата.
Цепочка, которую вы показываете, на самом деле может быть выполнена, если функции возвращали Calc вместо Calc& или вернул какой-то объект, отличный от * this — но тогда результат вычислений окажется в этом месте. Не там, где вы ожидаете: в cCalc.
Когда все три функции возвращаются *, это приводит к &cCalc в этом и возвращает cCalc. Следующий вызов к Sub имеет такую же ситуацию. И умножить тоже.
Добавить член не имеет функции Sub. Компилятор выдаст ошибку.
Но, если вы вернете * это, вы возвращаетесь ваш собственный объект (не ссылка). Теперь у вас есть один объект cCalc, который может использовать Sub (3). Sub (3) возвращает ваш объект и может использовать Mult (4).