|
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 394
|
||||||||||||||||
Как правильно перегружать операторы?22.09.2016, 22:03. Показов 3613. Ответов 14
Метки нет (Все метки)
Добрый день. Более-менее освоил Си, и вроде бы неплохо в нем разбираюсь. Решил взяться за плюсы.
Помогите разобраться с перегрузкой операторов. Я понял, что существуют разные виды перегрузки (как дружественная функция, как функция-член класса). Но когда и какой способ предпочтительно использовать? Вот есть у меня некий класс
Ну и чтобы можно было пользоваться оператором +=? Заранее спасибо.
0
|
||||||||||||||||
| 22.09.2016, 22:03 | |
|
Ответы с готовыми решениями:
14
Как же все-таки лучше всего перегружать операторы? Как правильно перегружать оператор? Как правильно перегружать унарный минус? |
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 22.09.2016, 22:06 | |
|
Как функцию-член класса реализуй. Дружественная только для ввода/вывода, с потоками.
2
|
|
|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
||||||
| 22.09.2016, 22:24 | ||||||
Сообщение было отмечено lonelyhunter как решение
Решение
1
|
||||||
|
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 394
|
|
| 22.09.2016, 22:39 [ТС] | |
|
А почему для += нужно возвращать ссылку, а для + константу?
0
|
|
|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
||||||||
| 22.09.2016, 22:55 | ||||||||
1
|
||||||||
|
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 394
|
||||||
| 22.09.2016, 22:58 [ТС] | ||||||
В C++ в таком случае что происходит? (21 строка)
0
|
||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 22.09.2016, 23:07 | |||||||
0
|
|||||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||
| 22.09.2016, 23:16 | ||
Сообщение было отмечено gru74ik как решение
Решениедавайте разбираться - имеем 2 способа перегрузки операторов: 1) в классе 2) вне класса. Прежде чем говорить о выборе того или другого способа давайте обсудим операторы, которые можно перегрузить только в один способ: а) Перегрузить только как член класса можно: - operator = - operator () - operator[] - operator -> - operator new - operator delete Заметим, что операторы new и delete перегружаются только как статические методы класса - ведь без объекта можно вызвать только статические. А тут важная критерия "без объекта" особенно для оператора new - думаю вы понимаете. б) Перегружать только глобально: - сюда относится только 1 тип операторов, и вопрос я считаю сложным (лично я его и завалил на испыте и получил 11, а не 12 Ответ в спойлереКликните здесь для просмотра всего текста
Операторы левый оперант, которых фундаментальный тип или другой пользовательский тип
И так мы определились с правилами без которых ни куда. Далее есть рекомендация от создателя языке С++: "Если оператор подразумевает изменение объекта - его стоит перегрузить как член-класса, в противном случаи - через глобальную функцию" Поэтому если у вас встанет вопрос, какой же выбрать - вспомните эту рекомендацию. Теперь третий и последний вопрос: мы уже определились, что оператор будет перегружен как глобальная функция, но данный оператор является неотъемлемой частью класса в частности оператор вывода/ввода - так как левый оперант у нас "неправильный" и мы вынуждены перегрузить только глобально, то встаёт вопрос - сколько сеттеров/геттеров нужно будет вызвать в этих операторах - хотя эту функцию будет писать тот же программист, и объявлена она будет в том же файле, где и класс. Поэтому очень часто этой функции предоставляют карт-бланш делая её дружественной. Тем самым мы архитектурно говорим, что она наша - просто сложились такие обстоятельства, что она снаружи класса.
3
|
||
|
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 394
|
|
| 22.09.2016, 23:30 [ТС] | |
|
Спасибо, буду разбираться дальше.
0
|
|
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
|
| 22.09.2016, 23:48 | |
|
Во-первых, немодифицирующие операторы с симметричными (по типу) операндами (типа бинарных арифметических), рекомендуется реализовывать отдельностоящей [friend] функцией, а не членом класса. Членом класса обычно реализуются только модифицирующие операторы (типа
+= или ++)Во-вторых, чтобы два раза не делать одно и то же, устойчивой идиомой является реализация бинарного + через +=.
0
|
|
|
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 394
|
|
| 23.09.2016, 09:35 [ТС] | |
|
Интересно. Мнения разделились. Выходит строгих правил нет.
0
|
|
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||||||||
| 23.09.2016, 10:01 | ||||||||
Добавлено через 1 минуту
0
|
||||||||
|
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 394
|
|
| 23.09.2016, 10:03 [ТС] | |
|
Ну выше была рекомендация использовать дружественные функции, только для работы с потоками. < >
0
|
|
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|||
| 23.09.2016, 12:49 | |||
|
На самом деле это одно из применений основного принципа ООП - всемерной минимизации взаимозависимостей.
1
|
|||
| 23.09.2016, 12:49 | |
|
Помогаю со студенческими работами здесь
15
какие операторы нельзя перегружать? Как правильно перегружать потоковый оператор вывода в файл? Для енама нельзя перегружать операторы?
Как правильно перегрузить операторы для собственных классов? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|