Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не вижу логики: (&**this)

14K
08 февраля 2007 года
coersion
4 / / 03.01.2006
Файл: <iterator>
Кусок кода:
_Pt operator->() const
{return (&**this); }

Не понимаю смысла в самой операции (&**this), зачем две *.
23K
08 февраля 2007 года
CyberManiac
9 / / 02.02.2007
Выглядит как адресс указателя на указатель...
5.4K
09 февраля 2007 года
Svyatozar
221 / / 11.09.2006
Цитата: coersion
Файл: <iterator>
Кусок кода:
_Pt operator->() const
{return (&**this); }

Не понимаю смысла в самой операции (&**this), зачем две *.


Лично я так это понимаю. Допустим в начале класса объявлена переменная типа "указатель на _Pt", к примеру, такое объявление в начале класса:

private:
_Pt *pointer;
...
public:

Всем известно что this указывает на первый элемент объекта класса, то есть в данном случае на pointer. В таком случае return(&**this) будет возвращать "адрес значения на которое указывает первый элемент в текущем объекте", то есть по сути эквивалентно записи return(pointer). Я не потрудился проверить свою версию и могу ошибаться.

309
09 февраля 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Всем известно что this указывает на первый элемент объекта класса, то есть в данном случае на pointer.


Нет, this - это указатель, содержащий адрес начала объекта, а что именно будет находиться в области со смещением 0 байт относительно this - очень спорный вопрос.

Кроме того, очень смущает порядок расположения операторов. Код вообще компилируется?????

395
09 февраля 2007 года
RelB
367 / / 09.11.2002
Цитата: el scorpio
Нет, this - это указатель, содержащий адрес начала объекта, а что именно будет находиться в области со смещением 0 байт относительно this - очень спорный вопрос.

Кроме того, очень смущает порядок расположения операторов. Код вообще компилируется?????


Нет, все проще... просто первая звездочка дает нам уже сам объект итератора. Т.к. у итератора перегружен оператор '*', то вторая вездочка выдает нам ссылку на объект в итераторе, а уже '&' выдает адрес объекта в итераторе.

Единственное, мне не совсем понятно, почему нельзя было просто написать return &_Myval?

3
09 февраля 2007 года
Green
4.8K / / 20.01.2000
Цитата: RelB

Единственное, мне не совсем понятно, почему нельзя было просто написать return &_Myval?


"Потому, что до зацепа водит мама два прицепа."
Посмотри, как реализованы операторы звездочка (operator*) в разных итераторах. Везде они не просто возвращают ссылку, но и выполняют некоторые необходимые действия.

395
09 февраля 2007 года
RelB
367 / / 09.11.2002
Цитата: Green
"Потому, что до зацепа водит мама два прицепа."
Посмотри, как реализованы операторы звездочка (operator*) в разных итераторах. Везде они не просто возвращают ссылку, но и выполняют некоторые необходимые действия.

Согласен, но все-таки не везде. Автор приводил пример из хидера <iterator>, я посмотрел туда и увидел следующий код:

 
Код:
const _Ty& operator*() const
        {   // return designated value
        return (_Myval);
        }

    const _Ty *operator->() const
        {   // return pointer to class object
        return (&**this);
        }

Собсвенно, поэтому я и ответил так. А в остальном совершенно согласен, другие итераторы выполняют определенные действия в операторе звездочка, поэтому наиболее оптимальным является использование именно такой конструкции.
14K
10 февраля 2007 года
coersion
4 / / 03.01.2006
Цитата: RelB
Согласен, но все-таки не везде. Автор приводил пример из хидера <iterator>, я посмотрел туда и увидел следующий код:
 
Код:
const _Ty& operator*() const
        {   // return designated value
        return (_Myval);
        }

    const _Ty *operator->() const
        {   // return pointer to class object
        return (&**this);
        }

Собсвенно, поэтому я и ответил так. А в остальном совершенно согласен, другие итераторы выполняют определенные действия в операторе звездочка, поэтому наиболее оптимальным является использование именно такой конструкции.



Спасибо, все так и есть, все компилится.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог