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

  Юрий  | 

  Обновл. 18 Июн 2019  | 

 8375

 ǀ   7 

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

Например, перегрузим унарный оператор минус () для класса 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.

Ответ

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

Первое:

Второе:

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

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

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

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

  1. Аватар Константин:

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

    1. Аватар говнодав:

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

  2. Аватар kmish:

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

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

    1. Аватар говнодав:

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

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

  3. Аватар Илья:

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

  4. Аватар Torgu:

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

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

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

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

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

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