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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Владимир_1994
2 / 2 / 0
Регистрация: 19.05.2013
Сообщений: 27
#1

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

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

Здравствуйте. Вопрос имею теоретический.
В классе 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 при перегрузке оператора присваивания
Посмотрите здесь:

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

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

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

Предупреждение при перегрузке оператора - C++
Есть вот такой код для созданный для обучения #include <iostream> using namespace std; class complex{ private: ...

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

& при перегрузке оператора ввода - C++
Скажите почему без & не будет работать? ostream& operator<<(ostream &stream,MyClass obj) { stream<<obj.a<<endl; return stream; ...

Ошибка при перегрузке оператора cin >> - C++
#include <iostream> using namespace std; /////////////////////////////////////////////////////////// class fraction { ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6474 / 2249 / 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
52 / 46 / 17
Регистрация: 18.07.2014
Сообщений: 194
29.07.2014, 19:59     От каких ошибок страхует Const при перегрузке оператора присваивания #4
Цитата Сообщение от Vourhey Посмотреть сообщение
И возвращай ссылку

А почему надо возвращать ссылку?
Vourhey
Почетный модератор
6474 / 2249 / 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
Почетный модератор
6474 / 2249 / 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
Почетный модератор
6474 / 2249 / 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
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
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
30.07.2014, 18:20     От каких ошибок страхует Const при перегрузке оператора присваивания #12
Цитата Сообщение от CyberSolver Посмотреть сообщение
Причем писать (x = y) = z; - это совсем уже конченый идиотизм
LOL это почему? Ты встроенных операторов языка Си не знаешь?
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
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
30.07.2014, 18:38     От каких ошибок страхует Const при перегрузке оператора присваивания #14
Цитата Сообщение от CyberSolver Посмотреть сообщение
можно же ведь переопределить operator+ так, чтобы было деление. Или #define true false.
или оператор =, который действует не аналогично встроенному оператору = и не возвращает ссылку

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

PS. Т.к. ты склонен сразу причислять не полностью с тобой согласных либо к "правым", либо к "левым", сразу напишу, что я не тот и не другой. У меня умеренные взгляды. Мне пока что просто интересно послушать твою версию.
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
6909 / 4102 / 933
Регистрация: 30.01.2014
Сообщений: 6,893
30.07.2014, 19:25     От каких ошибок страхует Const при перегрузке оператора присваивания #18

Не по теме:

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


Цитата Сообщение от CyberSolver Посмотреть сообщение
Лично я бы писал const просто для того, чтобы посмотреть, сколько дурней напишут (x = y) = z
Ну вот проверить нечто таким образом - это практика хорошая, особенно во время кровавого рефакторинга. Но брать именно за правило, если понимать Голуба буквально, лично я бы не рискнул. Кстати, за довольно большой промежуток времени общения со всяким легаси, подобный код попадался от силы пару раз, поэтому, по крайней мере для своего случая, имею право полагать, что проблема несущественна. Ну, у меня тоже есть своя статистика.
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++
Добрый день, есть такой кусок кода: #include <iostream> #include <ostream> using std::ostream; using namespace std; ...

Ошибка в перегрузке оператора - при работе с массивами - C++
Текст программы: #include <iostream> #include <windows.h> using namespace std; class array { public: array(); ...

Преждевременный вызов деструктора при перегрузке оператора + - C++
Изначальное задание: Используя списки написать программу, поддерживающую операцию сложения двух многочленов. Собственно все работает,...

Ошибка при перегрузке оператора, не знаю как исправить - C++
#pragma once #include <iostream> #include <vector> #define innerVectorType std::vector<T> template <class T> class Matrix ...

Когда нужно/не нужно возвращать объект при перегрузке присваивания? - C++
Доброго времени суток! Перегрузка присваивания: class alpha { private: int data; public: alpha() // конструктор без...


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

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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru