Урок №135. Перегрузка унарных операторов +, − и логического НЕ

  Юрий  | 

  |

  Обновл. 13 Сен 2021  | 

 49449

 ǀ   16 

Рассмотрим унарные операторы плюс (+), минус (-) и логическое НЕ (!), которые работают с одним операндом. Так как они применяются только к одному объекту, то их перегрузку следует выполнять через методы класса.

Например, перегрузим унарный оператор минус (-) для класса Dollars:

Примечание: Определение метода можно записать и внутри класса. Здесь мы определили его вне тела класса для лучшей наглядности.

Всё довольно-таки просто. Перегрузка отрицательного унарного оператора минус (-) осуществляется через метод класса, так как явные параметры в функции перегрузки отсутствуют (только неявный объект, на который указывает скрытый указатель *this). Оператор - возвращает объект Dollars с отрицательным значением m_dollars. Поскольку этот оператор не изменяет объект класса Dollars, то мы можем (и должны) сделать функцию перегрузки константной (чтобы иметь возможность использовать этот оператор и с константными объектами класса Dollars).

Обратите внимание, путаницы между отрицательным унарным оператором минус (-) и бинарным оператором минус (-) нет, так как они имеют разное количество параметров.

Вот еще один пример: оператор ! является логическим оператором НЕ, который возвращает true, если результатом выражения является false и возвращает false, если результатом выражения является true. Обычно это применяется к переменным типа bool, чтобы проверить, являются ли они true или нет:

В языке С++ значение 0 обозначает false, а любое другое ненулевое значение обозначает true, поэтому, если логический оператор ! применять к целочисленным значениям, то он будет возвращать true, если значением переменной является 0, в противном случае — false.

Следовательно, при работе с классами, оператор ! будет возвращать true, если значением объекта класса является false, 0 или любое другое значение, заданное как дефолтное (по умолчанию) при инициализации, в противном случае — оператор ! будет возвращать false.

В следующем примере мы рассмотрим перегрузку унарного оператора минус () и оператора логического НЕ (!) для класса Something:

Здесь перегруженный оператор НЕ (!) возвращает true, если в Something используются значения по умолчанию (0.0, 0.0, 0.0).

Результат выполнения программы:

Something is null.

Если же задать любые ненулевые значения для объекта класса Something:

То результатом будет:

Something is not null.

Тест

Реализуйте перегрузку унарного оператора плюс (+) для класса Something.

Ответ

Есть два решения.

Решение №1:

Решение №2:

Это работает, так как Something, который мы возвращаем, является текущим объектом.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (170 оценок, среднее: 4,85 из 5)
Загрузка...

Комментариев: 16

  1. Серегй:

    На мой взгляд подобная реализация перегрузки оператора "+" будет логичнее в контексте данного задания.

  2. Роман:

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

    Выход:

    My debt before 7
    My debt in time -7
    My debt after 7
    My debt before -9
    My debt in time -9
    My debt after -9

    C *this результат такой же.

    1. Grave18:

      -dollars1 — возвращает другой объект, чтобы что-то изменилось, нужно:

  3. Vlad:

    конверитрует каждое значение в положительное

    1. Анастасия:

      В таком случае подойдёт и это:

    2. Артём:

      Ага, а потом у тебя произойдёт переполнение при возведении в квадрат, и что делать будешь?
      Да ещё и потеря точности, так как в степень возводятся числа в формате double…

  4. zashiki:

    не нравится мне синтаксис с !
    при обычном bool return 1 , в if(!1) получается 0
    а при перегрузке bool return 1 , в if(!1) получается 1

    или я что то не понимаю (может, bool op! return 1 возвращает !1?), обьясните плиз

    путаница какая то

    1. Grave18:

      something = -something; — не работает
      something.printSomething(); — работает

      Если мы вернем Something(-m_a, -m_b, -m_c); по ссылке, то к моменту использования этого объекта, он уже будет унчтожен.
      something.printSomething(); — ссылка уже указывает на уничтоженный объект.

  5. Константин:

    Синтаксис возврата объектов из методов перегрузки унарного оператора — по значению. Не понятно. Я читаю этот код так: в стейтменте команды return создается временный объект, который возвращается по значению. Вроде бы в ранних уроках советовалось возвращать объекты по ссылке, так как копирование может быть затратным.

    1. говнодав:

      Если унарный оператор будет возвращать ссылку, то на какой объект? Даже если в нашем случае перегрузка идет через метод класса, следовательно функция перегрузки унарного оператора развернется и будет иметь в переданных параметрах ссылку на объект к которому применяется оператор, то в данном случае конструкция которая написана чуть выше не имеет смысла. "-а" изначально должен возвращать анонимный объект. А этот анонимный объект не имеет ссылки.
      Можно сделать и как вы сказали. Тогда придется изменять скрытые поля оъекта к которому применяется унарный оператор. А далее в caller вовзращать ссылку посредством банального разыменования объекта.
      Я вообще говноед по жизни, и слушать меня не стоит. Но все что я тут написал я лично проверил. Спасибо.

    2. Андрей:

      Объект не меняет. Но и нельзя сказать что он ничего не делает. В предложенной реализации он возвращает клон этого объекта.

  6. kmish:

    Да, с унарным+ бред какой-то.
    Может, он должен как унарный- работать и инвертировать обратно в +, если значения отрицательные.
    Что-то типа:

    Хотя опять же возникает вопрос, зачем он нужен тогда, если унарный- это может сделать…

    1. говнодав:

      Я говножуй, по жизни. Именно поэтому меня слушать не стоит. Но на мой сугубо личный взгляд, было бы правильнее унарный плюс расписать так:

      Хомячек Александр, тот что ниже, видимо никогда не применял унарный оператор к базовым типам, раз несет такой бред. Спасибо

  7. Илья:

    А если значения членов Something будут отрицательными?
    Разве такая функция не вернёт нам отрицательные значения?

  8. Torgu:

    Не очень понимаю, зачем вообще объекту нужен унарный плюс, как в задании? Он же никак совершенно не меняет объект

    1. Александр:

      Унарный плюс действительно совершенно бесполезный оператор. Добавлен он исключительно для симметрии.
      Для базовых типов он не делает ничего. Но при желании Вы можете придать ему некоторый смысл конкретно для Ваших объектов. Например, можно позаимствовать из JS синтаксис:

      для превращения строкового типа в числовой… довольно удобно

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *