Требуется ли объявление ключевых слов const с оператором равенства?

Я смотрел этот семинар по лучшим практикам C++, и спикер привел такой пример кода:

struct Data{
  int x;
  int y;

  bool operator==(Data &rhs){
   return x == rhs.x && y == rhs.y;
}
};

Затем он спросил, чего не хватает в этом коде. Как новичок, я думал, что ничего не пропало, но потом он указал, что не хватает 2 ключевых слов const, например:

struct Data{
  int x;
  int y;

    bool operator==(const Data &rhs) const{
     return x == rhs.x && y == rhs.y;
  }
};

Теперь я думаю, что это похоже на обещание не изменять объект. Но может кто-нибудь объяснить, зачем нужны эти const ключевые слова?

Я ожидаю, что этот «семинар по лучшим практикам С++» также объяснит, почему это обязательно. В конце концов, какой смысл проводить «семинар по лучшим практикам С++», если он не объясняет причину этих лучших практик?

Sam Varshavchik 10.01.2023 20:11

@SamVarshavchik Он не объяснил. Вот ссылка на видео, если интересно. youtube.com/watch?v=nqfgOCU_Do4

Dany 10.01.2023 20:14

Вот проблема: любой клоун может загрузить видео на Youtube, даже я могу это сделать. Хотя это правда, тот факт, что вам даже приходится задавать этот вопрос, только показывает, что Youtube не является заменой учебника по C++, и для изучения и полного понимания основных основ C++ требуется хороший отредактированный учебник. Нереально ожидать, что вы сможете полностью изучить C++, читая блоги и просматривая Youtube.

Sam Varshavchik 10.01.2023 20:17

К вашему сведению (не точная копия) Какие основные правила и идиомы для перегрузки операторов? . Также Операторы сравнения - типичные/ожидаемые подписи.

Richard Critten 10.01.2023 20:19

В этом контексте нет ничего особенного в operator==. Причины использования const здесь те же, что и для любой функции или метода, которые вы пишете.

john 10.01.2023 20:54

Как поясняет приведенная выше ссылка «основные правила», обычно считается, что operator== следует реализовать как функцию, не являющуюся членом. Это лучшая практика, так что это мало что говорит о лучшем видео, которое вы смотрите.

john 10.01.2023 20:59

Я бы тоже подумал добавить [[nodiscard]]

MatG 10.01.2023 21:00
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
1
7
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если бы у вас не было const в обоих местах вашего operator==, это не скомпилировалось бы:

void foo(const Data& lhs, const Data& rhs) {
    if (lhs == rhs) { // requires `operator==(const Data &rhs) const`
       // do stuff
    }
}
почему это обязательно

Это не так, но это хорошая практика, и если ее не реализовать таким образом, это серьезно затруднит возможность взаимодействия со стандартными (и другими) библиотеками.

  1. Ваша цель не изменить состояние *this (левая часть оператора ==). То же самое относится и здесь. Если *this равно const, квалификатор const в функции-члене делает возможным использование функции-члена.

Другие вопросы по теме