Я заметил, что многие классы строк в C++ не реализуют оператор ==
для сравнения со строками. В чем причина этого? Насколько я понимаю, реализация класса для строки должна сделать строку самой по себе сущностью, а не указателем на набор символов. Таким образом, мы определенно должны ожидать, что оператор ==
будет реализован для сравнения значений двух сущностей (то есть строк)!
Оператор проверки равенства в классах строк
Ответы (3)
Часто, когда класс не реализует operator==
, это происходит потому, что вне класса есть свободная функция. Преимущество бесплатной функции operator==
заключается в том, что она поддерживает неявные преобразования с обеих сторон. Это особенно важно для строк, потому что там часто используются литералы const char[]
и требуется неявное преобразование. Например.
MyString S("Hello");
if ("hello" == S) { // Can't use MyString::operator== here
std::cout << S;
}
std::string — это basic_string, и у него есть оператор ==, который использует метод сравнения char_traits.
Вы даже можете создать свой собственный специализированный класс признаков, чтобы выполнять сравнение без учета регистра.
Причиной отказа от реализации оператора == для строкового класса может быть то, что вы считаете, что существует больше способов сравнения строк: с учетом регистра/нечувствительным, игнорирование диакритических знаков... и вы предоставляете различные функции сравнения, чтобы пользователь мог указать.
Это все еще выбор, и, как уже прокомментировал Джефф Фостер: он реализован в единственной реальной строке на С++ (std::string)
==
. - person Rafid   schedule 28.01.2011==
, которое должно сравнивать очень низкий уровень значений, а не то, что они представляют (т.е. указатель против содержимого). - person Rafid   schedule 28.01.2011std::string
находятся здесь cplusplus.com/reference/string/operators - person Nim   schedule 28.01.2011