Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 9

перегрузка оператора ->

14.05.2022, 21:13. Показов 919. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
 
template<class T>
class Auto_ptr1
{
    T* m_ptr;
public:
 
    Auto_ptr1(T* ptr = nullptr)
        :m_ptr(ptr)
    {
    }
 
    
    ~Auto_ptr1()
    {
        delete m_ptr;
    }
 
    T& operator*() const { return *m_ptr; }
    T* operator->() const { return m_ptr; }
};
 
 
class Item
{
public:
    Item() { std::cout << "Item acquired\n"; }
    ~Item() { std::cout << "Item destroyed\n"; }
 
    int val = 90;
};
 
int main()
{
    Auto_ptr1<Item> item(new Item); // динамическое выделение памяти
 
    std::cout << item->val;
 
    return 0;
}
Не понимаю, почему в этом примере не приходиться разыменовывать указатель ,возвращенный перегруженным оператором ->,
ведь в случае с оператором * там возвращается ссылка на обьект (который получается через разыменовывание указателя),
а в случае с -> этот шаг пропускается
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.05.2022, 21:13
Ответы с готовыми решениями:

Перегрузка оператора []
Здравствуйте. Пробую перегрузить оператор . template &lt;class Element&gt; class List { public: struct Node { Element el; ...

Перегрузка оператора []
При перегрузке оператора возникли проблемы, подскажыте как правильно перегрузить этот оператор, чтоб можно было устанавливать и получать...

Перегрузка оператора ~
Как перегрузить оператор ~? Пишет, что слишком много параметров для этой функции оператора

6
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.05.2022, 21:20
Цитата Сообщение от den45 Посмотреть сообщение
а в случае с -> этот шаг пропускается
в стандарте так сказано
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13182 / 6818 / 1821
Регистрация: 18.10.2014
Сообщений: 17,255
14.05.2022, 21:37
Лучший ответ Сообщение было отмечено Croessmah как решение

Решение

Цитата Сообщение от den45 Посмотреть сообщение
Не понимаю, почему в этом примере не приходиться разыменовывать указатель ,возвращенный перегруженным оператором ->
Потому что, согласно правилам языка, к результату пользовательского -> компилятором еще раз автоматически применяется оператор ->.

То есть запись item->val по определению означает item.operator ->()->val. Все тут в порядке, ничего не нужно дополнительно разыменовывать.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.05.2022, 22:13
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Потому что, согласно правилам языка
в каком разделе стандарта это сказано, я не нашел.

Добавлено через 1 минуту
нашел только это http://eel.is/c++draft/over.ref

Добавлено через 30 минут
нашел вроде:
http://eel.is/c++draft/over.ma... otnote-113
1
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 9
14.05.2022, 22:14  [ТС]
Вы ведь сами сказали, что так в стандарте сказано?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.05.2022, 12:02
TheCalligrapher,den45, значит по сути в этом выражении item->val, -> на самом деле относится к самому последнему в цепочке скрытых вызовов перегруженных operator -> (если такие имеются).

Добавлено через 18 минут

If a user-defined operator-> is provided, the operator-> is called again on the value that it returns, recursively, until an operator-> is reached that returns a plain pointer. After that, built-in semantics are applied to that pointer.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13182 / 6818 / 1821
Регистрация: 18.10.2014
Сообщений: 17,255
15.05.2022, 18:24
Цитата Сообщение от _stanislav Посмотреть сообщение
TheCalligrapher,den45, значит по сути в этом выражении item->val, -> на самом деле относится к самому последнему в цепочке скрытых вызовов перегруженных operator -> (если такие имеются).
Не совсем понимаю, что имеется в виду. А что, промежуточные -> разве не являются ->?

Применение перегруженного пользовательского -> разворачивается в цепочку вызовов operator ->() до тех пор, пока мы не наткнемся на встроенный ->, то есть до тех пор, пока кто-то в этой цепочке не вернет голый указатель. Вот этот встроенный -> и сработает как ->val.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2022, 18:24
Помогаю со студенческими работами здесь

Перегрузка оператора []
Есть: class any{ char arr }

Перегрузка оператора ++
выводит не то значение привет. нужна Ваша подсказка. листинг из учебника: (тема: перегрузка оператора ++) #include &lt;iostream&gt; ...

Перегрузка оператора
Имеется время, например 12:12:12 Перегрузка инкремента Time &amp;Time::operator ++ () { Next(); return *this; } ...

Перегрузка оператора ++
Написал префиксную перегрузку ++ Vremya &amp;Vremya::operator ++ () { int sec = getSec(*this); //перевод в секунды ...

Перегрузка оператора +
не получается в своем классе перегрузить оператор + :( пишет &quot;error C2804: бинарный &quot;operator +&quot; имеет слишком много...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru