Какая разница между C и C++ в сравнении строк другими словами?
Я приехал из лагеря "С". Я видел программу, использующую == для сравнения строк, я пытался найти свою программу перегрузки, но не нашел ее. Означает ли это, что C++ имеет дело со строкой (char []), естественно с == и! =?
Если у меня есть свой собственный класс String, будет ли он таким же, что я могу использовать == и! = Без их определения? или применяется только к char []?
Редактировать:
Похоже, я смешал C char [] с C++ std :: string class. Хорошо, старый вопрос все еще применяется. Некоторые из них задавали следующие вопросы:
Мои программы определяли переменные char [], но по сравнению с оператором "==". Казалось, это работа. Они являются строкой в стиле C, но работают с "==". Разве компилятор автоматически конвертировал их в std :: string для меня, чтобы программы работали?
Edit2:
Вот рабочий образец.
if(name == "") return;
где "name" - это элемент класса MyString. Он имеет конструктор с параметром char *.
MyString имеет публичную функцию data(), она возвращает указатель строки char * C.
Итак, я сравниваю объекты MyString? или строки в стиле C?
Без перегрузки "! =" Я могу сделать что-то вроде ниже?
if( name.data() != somes_[i].data() )
....
"Это означает, что C++ имеет дело со строкой (char []
), естественно с ==
и !=
?"
Нет. Неправильно сравнивать строки C-стиля (т.е. char[]
или char*
) между собой с помощью ==
или !=
(Как в C, так и C++), потому что вы в конечном итоге сравниваете указатели, а не строки.
В C++ можно сравнить объект std::string
со std::string
C-стиля или другим объектом std::string
из-за operator==
std::string
operator==
и operator!=
:
std::string str1("abc"), str2("def");
if (str1 != str2 && str1 == "abc")
std::cout << "Yep, I got it.";
Означает ли это, что C++ имеет дело со строкой (char []), естественно с == и! =?
Нет; "aaa" == "aaa"
преобразует строковые литералы в char*
как обычно и сравнивает значения указателя. Однако большинство реализаций C и C++ будут дедублировать строковые литералы, по крайней мере в объектном файле, так что эти указатели будут одинаковыми. Этот стандарт не гарантируется стандартом, но широко применяется.
Другими словами, C++ не отличается от C в этом отношении, и сравнение значений char*
таким образом не лучше, чем в C.
Разве компилятор автоматически конвертировал их в std :: string для меня, чтобы программы работали?
std::string
перегружает операторы сравнения, которые работают с char*
. Если вы сравните char*
с std::string
то один из них будет использоваться.
char const *s = "aaa";
std::string t = "aaa";
s == t; // uses overloaded operator== to compare string values.
http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp
template< class CharT, class traits, class Alloc >
bool operator==( const CharT* lhs, const basic_string<CharT,Traits,Alloc>& rhs );
Не используйте! = Или! = Для сравнения строк стиля C (char * или char []).
Если вы уверены, что строки имеют нулевое завершение, используйте std :: strcmp(). Если вы не совсем на 100% ПОЗИТИВНЫ, что они имеют нулевое завершение, используйте std :: strncmp(), чтобы сравнить их.
если любая из ваших строк является std :: string, вы можете использовать оператор == или operator! =.
[отредактировано в ответ на комментарий от barnes53]
std::string
.