Я смотрел этот семинар по лучшим практикам 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 ключевые слова?
@SamVarshavchik Он не объяснил. Вот ссылка на видео, если интересно. youtube.com/watch?v=nqfgOCU_Do4
Вот проблема: любой клоун может загрузить видео на Youtube, даже я могу это сделать. Хотя это правда, тот факт, что вам даже приходится задавать этот вопрос, только показывает, что Youtube не является заменой учебника по C++, и для изучения и полного понимания основных основ C++ требуется хороший отредактированный учебник. Нереально ожидать, что вы сможете полностью изучить C++, читая блоги и просматривая Youtube.
К вашему сведению (не точная копия) Какие основные правила и идиомы для перегрузки операторов? . Также Операторы сравнения - типичные/ожидаемые подписи.
В этом контексте нет ничего особенного в operator==. Причины использования const здесь те же, что и для любой функции или метода, которые вы пишете.
Как поясняет приведенная выше ссылка «основные правила», обычно считается, что operator== следует реализовать как функцию, не являющуюся членом. Это лучшая практика, так что это мало что говорит о лучшем видео, которое вы смотрите.
Я бы тоже подумал добавить [[nodiscard]]
Если бы у вас не было const в обоих местах вашего operator==, это не скомпилировалось бы:
void foo(const Data& lhs, const Data& rhs) {
if (lhs == rhs) { // requires `operator==(const Data &rhs) const`
// do stuff
}
}
почему это обязательно
Это не так, но это хорошая практика, и если ее не реализовать таким образом, это серьезно затруднит возможность взаимодействия со стандартными (и другими) библиотеками.
Ваша цель не изменить состояние *this (левая часть оператора ==). То же самое относится и здесь. Если *this равно const, квалификатор const в функции-члене делает возможным использование функции-члена.
Я ожидаю, что этот «семинар по лучшим практикам С++» также объяснит, почему это обязательно. В конце концов, какой смысл проводить «семинар по лучшим практикам С++», если он не объясняет причину этих лучших практик?