2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
||||||
1 | ||||||
Зачем нужен operator++(int)30.03.2017, 13:45. Показов 5658. Ответов 34
Метки нет (Все метки)
Очень тупой вопрос - для чего нужен operator++(int)? Ну, то есть, понятно что он делает постинкремент. Непонятно почему этот инкремент не делает сам компилятор, на основе operator++().
0
|
30.03.2017, 13:45 | |
Ответы с готовыми решениями:
34
Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить? operator char() или operator int() Зачем преобразовывать itsVal в int, если эта переменная и так объявлена как тип int перегрузить operator()(int,int); |
872 / 459 / 90
Регистрация: 10.06.2014
Сообщений: 2,665
|
|
30.03.2017, 13:49 | 3 |
Маловероятно но может пригодится выполнять некоторые действия до или после инкремента
И если таких участков много - проще инкапсулировать их в операторе ++ чем дублировать вручную везде по коду
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
30.03.2017, 13:49 | 4 |
Мало ли у кого как извращённая фантазия будет работать.
Конечно, можно выразить и через оператор префиксного инкремента, но это если нужно. А может быть вы хотите запретить использование "неэффективного" постфиксного инкремента. То есть компилятор не может угадать ваши намерения, он просто не делает что-то "неявно".
0
|
Любитель чаепитий
|
|
30.03.2017, 13:50 | 5 |
банально, но правдиво: бывает так, что постинкремент нужен, преинкремент - нет.
так же это дополнительно даёт гибкость в использовании. Компилятор бы мог всё за вас генерировать, но он оставляет эту
1
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
30.03.2017, 13:50 [ТС] | 6 |
Дочитайте пост до конца. Компилятор должен сделать инкремент того, что прописано в operator++() итератора.
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
30.03.2017, 13:54 [ТС] | 9 |
Тогда я запрещу копировать итератор и всего делов.
Добавлено через 1 минуту Что-то да написано. Вопрос не о том, зачем нужен operator++ как таковой. Вопрос в том, зачем нужен operator++(int), если он элементарно выводится из operator++ (который один черт писать).
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
30.03.2017, 13:57 [ТС] | 11 |
Надо, если it++ делает что-то кроме "запомнить it, сделать ++it, вернуть сохраненное значение". Но я не представляю кому и зачем такое надо.
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
30.03.2017, 14:29 | 13 | |||||
Плохо когда что-то делается неявно без весомых причин.
Кому надо может написать (С++14)
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
30.03.2017, 21:48 | 14 |
Ну, в шарпе, допустим, так и сделано. Но там другая крайность: там нельзя перегрузить +=. Он автоматом выводится из + и =.
ИМХО, это больше связано с философией. В C++ "хорошо бы" чтобы операторы сохраняли свой смысл при перегрузке, но вовсе не обязательно. Можно ли автоматом выводить, например, >=, <= и > из < и ==, или +=,-=... или ++ ? Теоретически - да, можно. Причем, синтаксис для удаления автоматически сгенерированных определений уже есть ( = delete). Будет ли это в каком-нибудь C++100500? - ХЗ. Добавлено через 11 минут UPD: Да, я знаю об std::rel_ops , но это - костыль.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
30.03.2017, 21:58 | 15 |
Сообщение было отмечено Renji как решение
Решение
я думаю, это связанно с политическими мотивами.
в основном эта деталь нужна только инструментальщикам. например - разработчикам стандартной библиотеки. а это грубо говоря те же люди, что пилят сам компилятор. и им проще запилить функцию-член вручную, нежели вносить правки к ядро компилятора. не настолько это важная вещь, что бы ради неё обязывать всех поставщиков вносить правки в компилятор.
1
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
31.03.2017, 01:02 | 17 |
Вот, кстати, иногда не хватает. Правда не столько оператора, сколько стандартных алгоритмов, его принимающих.
0
|
Комп_Оратор)
|
|
31.03.2017, 01:08 | 18 |
Renji, у меня вот какое предположение возникло во поводу:
MyType temp(*this); :а что если у Вас нет конструктора копирования? То есть, Вы можете создать объект для возврата, проинициализировав поля полями вашего объекта или как-то ещё, но компилятор то при чём?
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
31.03.2017, 01:14 [ТС] | 19 |
Тогда и return temp не скомпилируется. Постинкремент создает копию итератора по определению, а значит если итератор не копируемый, то и постинкремента у него быть не может.
1
|
Комп_Оратор)
|
|
31.03.2017, 01:37 | 20 |
Верно. Тогда, остаётся единственное предположение:
Не давая компилятору автоматически генерить код видя someObj++ , если у него есть определение префиксного инкремента, создатели C++ позволяют нам не разрешать этого делать, если мы этого не хотим. Для этого и требуется явное определение постинкрементого оператора (предположение). То есть допустим, не выгодно создавать промежуточный объект и мы не определяем такой оператор, чтобы юзер класса не смог написать такой постинкремент. На большее, что-то голова уже не тянет. Спать пора. Добавлено через 12 минут И ещё. Префиксная форма может (и должна бы) возвращать ссылку и оператор копирования не нужен-таки, так что и первый аргумент в силе. А постфикс ссылку нивжисть не вернет. Всё. Я, - баинки. Спокойной ночи.
0
|
31.03.2017, 01:37 | |
31.03.2017, 01:37 | |
Помогаю со студенческими работами здесь
20
error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+' Operator int() в классе Строка operator int() что за зверь? invalid operands of types 'double' and 'int' to binary 'operator%' Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |