170 похожих чатов

Мне нужно разбираться в этой теме. Заметил свою логическую ошибку. Запутался

в определениях. Значит, согласно здравому смыслу, унарный оператор работает только с одним объектом.

Всё перегрузил правильно, у унарного плюса нет параметров в перегрузке.

Но мне остаётся неясным. Вот у меня два бинарных оператора — + и ==. В первом случае я могу воспользоваться this, но во-втором, во всех примерах, которые я встречал, мне попадается версия перегрузки с двумя параметрами. Вот я никак не могу понять разницу, можно ли использовать для == один параметр?

P.S. не совсем понимаю, что значит member.
P.S.S. почему у этой перегрузки есть доступ к приватным полям, если она не friend?

10 ответов

11 просмотров

Для == использовать один параметр можно, пример: #include <iostream> struct A { int field; bool operator==(const A& other) { return field == other.field; } }; int main() { A a{1}, b{2}; std::cout << (a == b); } Все вполне также будет работать. member - функция-член класса у функции-члена есть доступ к приватным полям класса

disba1ancer
так формально параметра всё равно 2

я понимаю, в контексте разговора неявный this не учитываем

смкх
я понимаю, в контексте разговора неявный this не у...

для операторов он очень даже явный, при вызове

Владимир- Автор вопроса
disba1ancer
так формально параметра всё равно 2

Да, об этом и речь. Почему то во всех примерах, которые я видел, именно операторы сравнения == перегружают через два явных параметра, хотя, как теперь мне стало понятно, this никуда не делся. Это излишне? Или наоборот удобнее? Или просто совпадение?

Просто есть небольшая условность, какие операторы какими функциями перегружать(методами, дружественными или обычными). К примеру (), [] обычно перегружаются методами, а бинарные операторы, которые не изменяют левый операнд, дружественными/обычными функциями. Но жестких требований к определенным операторам может не быть

Владимир
Да, об этом и речь. Почему то во всех примерах, ко...

оператор == можно определить как член класса, в этом случае в объявлении и определении будет только один аргумент, правый операнд, а левым операндом будет не явный this; либо можно определить как свободную функцию и тогда неявного this там не будет, а будет 2 явных аргумента, левый и правый операнды

Denys Khodakov
Просто есть небольшая условность, какие операторы ...

скобки в принципе свободными функциями не перегрузить

disba1ancer
для операторов он очень даже явный, при вызове

При вызове аргумент. Параметр в сигнатуре.

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Вопрос по WIN32: Насколько я понимаю то все функции win32 привязаны к объектам операционной системы. Например консоль, файл, кисть, окна итд. Следовательно функции win32 упра...
Tommy Vercetti
6
Hello, can I install macOS and run flutter on a virtual machine? Is it possible to print for iphone?
Mazones
11
кто-то пользуется компонентами rx ? как их лучше ставить, через OPM? (lazarus)
Iluha Companets
15
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
Дороу! У кого-нибудь есть в загашнике проверенная функция экранирования, аналог re.escape в Python? Из доки: » Escape all the characters in pattern except ASCII letters and n...
Daniil Smolyakov
9
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
Карта сайта