как * вернуть неявно вернуть ссылку

this является const ptr для объекта / экземпляра, который функция-член получает неявно, так как же return *this возвращает ссылку?

Насколько я знаю, разыменование указателя на переменную означает, что она содержит адрес своей памяти, поэтому return *this должно возвращать значение, разыменованное этим константным указателем, что к чему? Объект?

Кроме того, почему вы не можете сделать что-то вроде этого:

Calc cCalc;
cCalc.Add(5).Sub(3).Mult(4);

Не имея всех функций-членов return *this?

Я хотел бы знать, как указатели и ссылки относятся к объектам / экземплярам.

1

Решение

Давайте попробуем распутать:

это const ptr для объекта / экземпляра, который функция-член получает неявно

функции-члены действительно получают этот указатель неявно. Типом является T * или const T * в зависимости от сигнатуры функции-члена — вы получаете const, помещая ключевое слово const в хвост после ().

так как return * возвращает ссылку?

* это разыменование указателя, таким образом создавая lvalue типа T или const T соответственно. Если ваш вопрос подразумевается, как вы получите T& Исходя из этого, в константном ответе, ответом, который вы не сделаете, будет попытка неправильно сформированного кода.

Насколько я знаю, разыменование указателя на переменную означает, что она содержит адрес своей памяти, поэтому return * this должно вернуть значение, разыменованное этим константным указателем, что и что? Объект?

* это обозначает экземпляр. И это lvalue выражение. Таким образом, вы можете получить его адрес agan (предоставив такой же, как этот), или можете привязать его к ссылке — включая случай возврата.

Цепочка, которую вы показываете, на самом деле может быть выполнена, если функции возвращали Calc вместо Calc& или вернул какой-то объект, отличный от * this — но тогда результат вычислений окажется в этом месте. Не там, где вы ожидаете: в cCalc.

Когда все три функции возвращаются *, это приводит к &cCalc в этом и возвращает cCalc. Следующий вызов к Sub имеет такую ​​же ситуацию. И умножить тоже.

1

Другие решения

Добавить член не имеет функции Sub. Компилятор выдаст ошибку.

Но, если вы вернете * это, вы возвращаетесь ваш собственный объект (не ссылка). Теперь у вас есть один объект cCalc, который может использовать Sub (3). Sub (3) возвращает ваш объект и может использовать Mult (4).

0

По вопросам рекламы [email protected]