Форум программистов, компьютерный форум CyberForum.ru

От каких ошибок страхует Const при перегрузке оператора присваивания - C++

Восстановить пароль Регистрация
 
Владимир_1994
2 / 2 / 0
Регистрация: 19.05.2013
Сообщений: 27
29.07.2014, 19:39     От каких ошибок страхует Const при перегрузке оператора присваивания #1
Здравствуйте. Вопрос имею теоретический.
В классе A перегружается оператор присваивания, объявление выглядит так:
C++
1
const A operator = (const Array &a);
От какого рода ошибок страхует первый const?
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2014, 19:39     От каких ошибок страхует Const при перегрузке оператора присваивания
Посмотрите здесь:

Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? C++
Зачем нужен const при перегрузке оператора C++
C++ [C++] Ошибка в перегрузке оператора +=
C++ Ошибка в перегрузке оператора - при работе с массивами
C++ Ошибка при перегрузке оператора, не знаю как исправить
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
29.07.2014, 19:43     От каких ошибок страхует Const при перегрузке оператора присваивания #2
Цитата Сообщение от Владимир_1994 Посмотреть сообщение
От какого рода ошибок страхует первый const?
Чтобы ты не менял операнд справа. И возвращай ссылку. const в начале можешь убрать.
Владимир_1994
2 / 2 / 0
Регистрация: 19.05.2013
Сообщений: 27
29.07.2014, 19:51  [ТС]     От каких ошибок страхует Const при перегрузке оператора присваивания #3
Там ошибка в коде. Правильно должно быть так:
C++
1
const A& operator = (const Array &a);
То есть действительно возвращается ссылка. По поводу операнда справа и второго cоnst мне понятно. Но первый все таки зачем то нужен.
porshe
 Аватар для porshe
52 / 46 / 17
Регистрация: 18.07.2014
Сообщений: 194
29.07.2014, 19:59     От каких ошибок страхует Const при перегрузке оператора присваивания #4
Цитата Сообщение от Vourhey Посмотреть сообщение
И возвращай ссылку

А почему надо возвращать ссылку?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
29.07.2014, 20:18     От каких ошибок страхует Const при перегрузке оператора присваивания #5
Цитата Сообщение от Владимир_1994 Посмотреть сообщение
Но первый все таки зачем то нужен
Не нужен.
Цитата Сообщение от porshe Посмотреть сообщение
А почему надо возвращать ссылку?
Стандартная практика, и для избежания оверхеда. Для ожидаемой работы в различных выражениях, типа:
(a = b) = с;
Владимир_1994
2 / 2 / 0
Регистрация: 19.05.2013
Сообщений: 27
29.07.2014, 20:21  [ТС]     От каких ошибок страхует Const при перегрузке оператора присваивания #6
Vourhey, То есть Вы считаете, что это const - ошибка, и не может быть такой ситуации, где это бы пригодилось?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
29.07.2014, 20:26     От каких ошибок страхует Const при перегрузке оператора присваивания #7
Цитата Сообщение от Владимир_1994 Посмотреть сообщение
Vourhey, То есть Вы считаете, что это const - ошибка
Смотря чего ты добиться хочешь. Есть негласное правило - пользовательский тип должен обеспечивать поведение, как встроенные типы. Например, int. C int я могу сделать:
C++
1
2
int i,j,k;
(i=j)=k;
С твоим типом, пока там стоит const я так сделать не могу. Его поведение без причины отличается от обычных типов. С моей точки зрения, да, это ошибка.
Владимир_1994
2 / 2 / 0
Регистрация: 19.05.2013
Сообщений: 27
29.07.2014, 20:32  [ТС]     От каких ошибок страхует Const при перегрузке оператора присваивания #8
А к примеру чего можно хотеть добиться таким образом?
Просто это из лекций computer science center, а они похоже знают, что делают.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
29.07.2014, 21:25     От каких ошибок страхует Const при перегрузке оператора присваивания #9
Цитата Сообщение от Владимир_1994 Посмотреть сообщение
А к примеру чего можно хотеть добиться таким образом?
Поведения как у встроенных типов. Либо некомпилируемого кода в случае из лекций CSC.
Цитата Сообщение от Владимир_1994 Посмотреть сообщение
а они похоже знают, что делают.
А, похоже, что не знают. Докажи обратное.

Добавлено через 18 минут
Ну или найди мне на каких-нибудь серьезных ресурсах с const.
Владимир_1994
2 / 2 / 0
Регистрация: 19.05.2013
Сообщений: 27
29.07.2014, 21:38  [ТС]     От каких ошибок страхует Const при перегрузке оператора присваивания #10
Может быть дельше будет ответ, узнаю - напишу.
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
30.07.2014, 18:14     От каких ошибок страхует Const при перегрузке оператора присваивания #11
Vourhey, Владимир_1994, это есть у Алена Голуба (правило 124).
Кликните здесь для просмотра всего текста
Наконец, operator=() должен возвращать ссылку на константу
просто потому, что не хотите, чтобы кто-нибудь имел возможность
модифицировать возвращенный объект после того, как произошло
присваивание. Следующее будет недопустимым в случае возврата ссылки
на константу:
(x = y) = z;


Есть негласное правило - пользовательский тип должен обеспечивать поведение, как встроенные типы.
Да, но это именно правило. Причем писать (x = y) = z; - это совсем уже конченый идиотизм, и здесь мне по барабану на поведение встроенных типов.

Не по теме:

Если можно запретить писать меньше дури - пусть уж лучше так. Хотя тут же набигут толпы "профессионалов", которым эта вещь была не нужна, но после запрета вдруг резко понадобилась.

Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
30.07.2014, 18:20     От каких ошибок страхует Const при перегрузке оператора присваивания #12
Цитата Сообщение от CyberSolver Посмотреть сообщение
Причем писать (x = y) = z; - это совсем уже конченый идиотизм
LOL это почему? Ты встроенных операторов языка Си не знаешь?
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
30.07.2014, 18:29     От каких ошибок страхует Const при перегрузке оператора присваивания #13
Kuzia domovenok, писать i++ + ++i - тоже конченый идиотизм. Давайте так: вы мне будете приводить примеры кода, а я буду определять: просто идиотизм, идиотизм конченый, или есть в идиотизме благая цель.

Ах да: можно же ведь переопределить operator+ так, чтобы было деление. Или #define true false. Вот ведь чёрт, пойду-ка я подправлю код своей либы.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
30.07.2014, 18:38     От каких ошибок страхует Const при перегрузке оператора присваивания #14
Цитата Сообщение от CyberSolver Посмотреть сообщение
можно же ведь переопределить operator+ так, чтобы было деление. Или #define true false.
или оператор =, который действует не аналогично встроенному оператору = и не возвращает ссылку

Добавлено через 2 минуты
Цитата Сообщение от CyberSolver Посмотреть сообщение
писать i++ + ++i - тоже конченый идиотизм.
нет, всего-навсего UB, в отличие от сабжа.
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
30.07.2014, 18:42     От каких ошибок страхует Const при перегрузке оператора присваивания #15
Kuzia domovenok, то есть если вы встретите код своего коллеги, в котором написано всё перечисленное, не предложите его отправить на 2 года на каторжные работы (программировать на Basic, например), а пожмёте плечами и скажете: ну тут мы делаем как у встроенных типов, тута вообще ХЗ UB и т.д.? Мне просто чисто энтомологически интересно.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
30.07.2014, 18:57     От каких ошибок страхует Const при перегрузке оператора присваивания #16
Цитата Сообщение от CyberSolver Посмотреть сообщение
Причем писать (x = y) = z; - это совсем уже конченый идиотизм,
Да никто так и не пишет. Ясное дело, что данный пример приведен для иллюстрации.
Кстати, а зачем нужно, чтобы объект нельзя было модифицировать после присваивания по возвращенной на него ссылке? Какая проблема решается таким образом? Если к некоему объекту применен оператор присваивания, значит он априори неконстантный, так зачем запрещать его менять по возвращаемой ссылке?

PS. Т.к. ты склонен сразу причислять не полностью с тобой согласных либо к "правым", либо к "левым", сразу напишу, что я не тот и не другой. У меня умеренные взгляды. Мне пока что просто интересно послушать твою версию.
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
30.07.2014, 19:14     От каких ошибок страхует Const при перегрузке оператора присваивания #17
Цитата Сообщение от DrOffset Посмотреть сообщение
Да никто так и не пишет.
Так как я склонен считать, что в интернетах кто-то неправ, то могу смело заявить: а вот в компании Kuzia domovenok это корпоративный стандарт .

Ещё раз цитирую Голуба:
Цитата Сообщение от CyberSolver Посмотреть сообщение
Наконец, operator=() должен возвращать ссылку на константу
просто потому, что не хотите, чтобы кто-нибудь имел возможность
модифицировать возвращенный объект после того, как произошло
присваивание.
Ну вот хотелка такая у него. Я же полностью согласен с Kuzia domovenok - если кто-то переопределяет стандартный оператор, то пусть обеспечит семантику встроенных типов. Лично я бы писал const просто для того, чтобы посмотреть, сколько дурней напишут (x = y) = z. Такая вот статистика .
Цитата Сообщение от DrOffset Посмотреть сообщение
PS. Т.к. ты склонен сразу причислять не полностью с тобой согласных либо к "правым", либо к "левым", сразу напишу, что я не тот и не другой. У меня умеренные взгляды. Мне пока что просто интересно послушать твою версию.
Хм. Человек на форуме, которого я даже не знаю, уже причислил меня к религиозным фундаменталистам. Обычное дело.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
30.07.2014, 19:25     От каких ошибок страхует Const при перегрузке оператора присваивания #18

Не по теме:

Цитата Сообщение от CyberSolver Посмотреть сообщение
уже причислил меня к религиозным фундаменталистам
Ну ты же причислил меня в соседней векте к любителям писать ОС на интерпретаторе (грубо говоря). А Кузю сам тут же причислил к любителям усложнизмов:
Цитата Сообщение от CyberSolver Посмотреть сообщение
а вот в компании Kuzia domovenok это корпоративный стандарт
Так что мы почти квиты
А вообще, не принимай близко, я абсолютно без злого умысла это написал. Только ради улучшения взаимопонимания.


Цитата Сообщение от CyberSolver Посмотреть сообщение
Лично я бы писал const просто для того, чтобы посмотреть, сколько дурней напишут (x = y) = z
Ну вот проверить нечто таким образом - это практика хорошая, особенно во время кровавого рефакторинга. Но брать именно за правило, если понимать Голуба буквально, лично я бы не рискнул. Кстати, за довольно большой промежуток времени общения со всяким легаси, подобный код попадался от силы пару раз, поэтому, по крайней мере для своего случая, имею право полагать, что проблема несущественна. Ну, у меня тоже есть своя статистика.
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
30.07.2014, 19:33     От каких ошибок страхует Const при перегрузке оператора присваивания #19
DrOffset, Голуба я привел просто как пример - у него есть хоть какая-то аргументация (overhead, тупость некрасивый код, мне-вот-так-хочется-выпендриться). Любой совет подобного рода, исходящий хоть от Страуструпа, нужно пропустить через мозг и опыт. Это к вопросу о
Цитата Сообщение от DrOffset Посмотреть сообщение
Кстати, за довольно большой промежуток времени общения со всяким легаси, подобный код попадался от силы пару раз, поэтому, по крайней мере для своего случая, имею право полагать, что проблема несущественна.
Проблема? Это вообще не проблема. Это вопрос религии.
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну, у меня тоже есть своя статистика.
Поделитесь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2014, 19:45     От каких ошибок страхует Const при перегрузке оператора присваивания
Еще ссылки по теме:

& при перегрузке оператора ввода C++
Предупреждение при перегрузке оператора C++
C++ Преждевременный вызов деструктора при перегрузке оператора +

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

Или воспользуйтесь поиском по форуму:
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
30.07.2014, 19:45     От каких ошибок страхует Const при перегрузке оператора присваивания #20
Цитата Сообщение от CyberSolver Посмотреть сообщение
Поделитесь?
Так уже, выше же. Да и ко мне можно на ты. Не люблю строить лишних барьеров.

Говоря в общем, очень многие из тех советов, которые вроде как бы нацелены на предупреждение говнокода не очень хорошего кода, на самом деле на парктике (по крайней мере в тех проектах, где я работал) особо-то и не пригождались за неимением прецедентов. Зато сплошь и рядом встречаются вещи, до которых лично я додумался бы разве только спьяну. Ну то есть подвохи встречаются там, где совсем не ждешь. В итоге статистика набегает не в пользу шаблонных стереотипов о правильном коде, их-то как раз большинство придерживается, а вот отчудить могут совсем в неожиданной форме.

Добавлено через 1 минуту
Цитата Сообщение от CyberSolver Посмотреть сообщение
Любой совет подобного рода, исходящий хоть от Страуструпа, нужно пропустить через мозг и опыт.
За эту здравую мысль поставлю плюс.
Yandex
Объявления
30.07.2014, 19:45     От каких ошибок страхует Const при перегрузке оператора присваивания
Ответ Создать тему
Опции темы

Текущее время: 09:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru