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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Не по теме:

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

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

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

Добавлено через 2 минуты
Цитата Сообщение от CyberSolver Посмотреть сообщение
писать i++ + ++i - тоже конченый идиотизм.
нет, всего-навсего UB, в отличие от сабжа.
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
30.07.2014, 18:42 #15
Kuzia domovenok, то есть если вы встретите код своего коллеги, в котором написано всё перечисленное, не предложите его отправить на 2 года на каторжные работы (программировать на Basic, например), а пожмёте плечами и скажете: ну тут мы делаем как у встроенных типов, тута вообще ХЗ UB и т.д.? Мне просто чисто энтомологически интересно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2014, 18:42
Привет! Вот еще темы с ответами:

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

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

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

Константность ссылки в параметре при перегрузке оператора - C++
Здравствуйте! При создании класса комплексные числа операцию сложения определяю так complex operator + (complex&a) { return...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.07.2014, 18:42
Ответ Создать тему
Опции темы

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