Не понимаю этот тип возврата? - PullRequest
0 голосов
/ 27 сентября 2019

Я читаю некоторый код, который дал мне мой учитель, и я не совсем понимаю одну конкретную строку кода.Функция возвращает int &.

return (*(Vector *)this)[i];

, этот оператор возврата находится в перегрузке оператора «[]».Существует также другая перегрузка оператора [], которая определена в базовом классе «this».Базовый класс - это определенный класс «Вектор».Я не понимаю эту строку кода.

Ответы [ 2 ]

5 голосов
/ 27 сентября 2019

Если есть сомнения, упростите.

Первый шаг:

return (*(Vector *)this)[i];

может быть

Vector* ptr = (Vector*)this;
return (*ptr)[i];

Второй шаг:

return (*ptr)[i];

может быть

Vector& ref = *ptr;
return ref[i];

Оба упрощения вместе взятые, строка

return (*(Vector *)this)[i];

эквивалентна

Vector* ptr = (Vector*)this;
Vector& ref = *ptr;
return ref[i];

Когда функция-член является const функцией-членом, this имеет тип Vector const* const.

Первая строка удаляет const -нессность указателя объекта.
Вторая строка разыменовывает указатель.
Последняя строка возвращаетi -й элемент объекта.

0 голосов
/ 27 сентября 2019

Я не понимаю эту строку кода.

return (*(Vector *)this)[i];

Предполагая, что T - это тип, T* - это тип "указатель на T".Таким образом, учитывая, что Vector является типом, Vector* является указателем на Vector.

this является специальным именем, которое является указателем на аргумент объекта функции-члена.

(T)expr - явное преобразование типов.Он выполняет одно или сочетание статического приведения, переинтерпретации приведения или константного приведения к выражению, преобразовывая значение в тип T.В выражении (Vector *)this указатель this преобразуется в тип Vector*.Учитывая, что Vector является базовым классом, это статическое приведение, а точнее, приведение вверх, потому что мы приводим в иерархию наследования.

Унарный оператор * в *expr равеноператор косвенного обращения.Он опосредуется через операнд-указатель (в данном случае) и приводит к l-значению указанного объекта.Таким образом, *(Vector *)this будет lvalue типа Vector, который является субобъектом базового класса this.

expr[index] является оператором индекса.Таким образом, (*(Vector *)this)[i] вызывает оператор индекса базового класса для объекта this.

Наконец, оператор return expr; выпрыгивает из функции и возвращает значение выражения вызывающей стороне.Таким образом, return (*(Vector *)this)[i]; возвращает результат нижестоящего оператора базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...