Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 19.05.2013
Сообщений: 27
1

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

29.07.2014, 19:39. Показов 1060. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Вопрос имею теоретический.
В классе A перегружается оператор присваивания, объявление выглядит так:
C++
1
const A operator = (const Array &a);
От какого рода ошибок страхует первый const?
Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2014, 19:39
Ответы с готовыми решениями:

Почему при перегрузке оператора присваивания, возвращаемое значение не константно?
Почему при перегрузке оператора присваивания, возвращаемое значение - someClass & operator=(const...

Зачем нужен const при перегрузке оператора
Следующий код описывает класс СТРОКА string_. При перегрузке оператора '=' string_&...

Альтернатива перегрузке оператора присваивания
Я знаю, что перегрузка оператора присваивания в C# не возможна. Мне нужно найти альтернативный...

Избыточное копирование объекта при реализации оператора умножения и оператора присваивания
Есть класс работы с матрицами. Есть операция умножения матриц, описанная как оператор класса. В...

19
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
29.07.2014, 19:43 2
Цитата Сообщение от Владимир_1994 Посмотреть сообщение
От какого рода ошибок страхует первый const?
Чтобы ты не менял операнд справа. И возвращай ссылку. const в начале можешь убрать.
0
2 / 2 / 0
Регистрация: 19.05.2013
Сообщений: 27
29.07.2014, 19:51  [ТС] 3
Там ошибка в коде. Правильно должно быть так:
C++
1
const A& operator = (const Array &a);
То есть действительно возвращается ссылка. По поводу операнда справа и второго cоnst мне понятно. Но первый все таки зачем то нужен.
0
57 / 51 / 42
Регистрация: 18.07.2014
Сообщений: 194
29.07.2014, 19:59 4
Цитата Сообщение от Vourhey Посмотреть сообщение
И возвращай ссылку

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

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


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

Не по теме:

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

0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
30.07.2014, 18:20 12
Цитата Сообщение от CyberSolver Посмотреть сообщение
Причем писать (x = y) = z; - это совсем уже конченый идиотизм
LOL это почему? Ты встроенных операторов языка Си не знаешь?
0
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
30.07.2014, 18:29 13
Kuzia domovenok, писать i++ + ++i - тоже конченый идиотизм. Давайте так: вы мне будете приводить примеры кода, а я буду определять: просто идиотизм, идиотизм конченый, или есть в идиотизме благая цель.

Ах да: можно же ведь переопределить operator+ так, чтобы было деление. Или #define true false. Вот ведь чёрт, пойду-ка я подправлю код своей либы.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
30.07.2014, 18:38 14
Цитата Сообщение от CyberSolver Посмотреть сообщение
можно же ведь переопределить operator+ так, чтобы было деление. Или #define true false.
или оператор =, который действует не аналогично встроенному оператору = и не возвращает ссылку

Добавлено через 2 минуты
Цитата Сообщение от CyberSolver Посмотреть сообщение
писать i++ + ++i - тоже конченый идиотизм.
нет, всего-навсего UB, в отличие от сабжа.
0
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
30.07.2014, 18:42 15
Kuzia domovenok, то есть если вы встретите код своего коллеги, в котором написано всё перечисленное, не предложите его отправить на 2 года на каторжные работы (программировать на Basic, например), а пожмёте плечами и скажете: ну тут мы делаем как у встроенных типов, тута вообще ХЗ UB и т.д.? Мне просто чисто энтомологически интересно.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
30.07.2014, 18:57 16
Цитата Сообщение от CyberSolver Посмотреть сообщение
Причем писать (x = y) = z; - это совсем уже конченый идиотизм,
Да никто так и не пишет. Ясное дело, что данный пример приведен для иллюстрации.
Кстати, а зачем нужно, чтобы объект нельзя было модифицировать после присваивания по возвращенной на него ссылке? Какая проблема решается таким образом? Если к некоему объекту применен оператор присваивания, значит он априори неконстантный, так зачем запрещать его менять по возвращаемой ссылке?

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

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

Не по теме:

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


Цитата Сообщение от CyberSolver Посмотреть сообщение
Лично я бы писал const просто для того, чтобы посмотреть, сколько дурней напишут (x = y) = z
Ну вот проверить нечто таким образом - это практика хорошая, особенно во время кровавого рефакторинга. Но брать именно за правило, если понимать Голуба буквально, лично я бы не рискнул. Кстати, за довольно большой промежуток времени общения со всяким легаси, подобный код попадался от силы пару раз, поэтому, по крайней мере для своего случая, имею право полагать, что проблема несущественна. Ну, у меня тоже есть своя статистика.
0
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
30.07.2014, 19:33 19
DrOffset, Голуба я привел просто как пример - у него есть хоть какая-то аргументация (overhead, тупость некрасивый код, мне-вот-так-хочется-выпендриться). Любой совет подобного рода, исходящий хоть от Страуструпа, нужно пропустить через мозг и опыт. Это к вопросу о
Цитата Сообщение от DrOffset Посмотреть сообщение
Кстати, за довольно большой промежуток времени общения со всяким легаси, подобный код попадался от силы пару раз, поэтому, по крайней мере для своего случая, имею право полагать, что проблема несущественна.
Проблема? Это вообще не проблема. Это вопрос религии.
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну, у меня тоже есть своя статистика.
Поделитесь?
2
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
30.07.2014, 19:45 20
Цитата Сообщение от CyberSolver Посмотреть сообщение
Поделитесь?
Так уже, выше же. Да и ко мне можно на ты. Не люблю строить лишних барьеров.

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

Добавлено через 1 минуту
Цитата Сообщение от CyberSolver Посмотреть сообщение
Любой совет подобного рода, исходящий хоть от Страуструпа, нужно пропустить через мозг и опыт.
За эту здравую мысль поставлю плюс.
1
30.07.2014, 19:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2014, 19:45
Помогаю со студенческими работами здесь

Ошибка при перегрузке оператора +
Имеется класс, который представляет из себя строку и количество символов в ней. Задача -...

Ошибка при перегрузке оператора >>
Приветствую. Есть 2 класса: enum Color { white = 1, red, green, blue, yellow }; class Shape {...

Ошибка при перегрузке оператора ==
У меня компилятор выдает ошибку error LNK2019: ссылка на неразрешенный внешний символ "bool __cdecl...

Ошибка при перегрузке оператора <<
class Predmet { private: int id; string name; public: Predmet() {}; Predmet(string name,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru