Puis-je utiliser! = Et == en C ++ pour comparer des chaînes sans écrire moi-même?

Quelle est la différence entre C et C ++ dans la comparaison de chaînes en d’autres termes?

Je viens du camp ‘C’. J’ai vu un programme utiliser == pour comparer des chaînes, j’ai essayé de trouver son programme de surcharge, mais je n’en ai pas trouvé. Cela signifie-t-il que C ++ traite avec ssortingng (char []) naturellement avec == et! =?
Si j’ai ma propre classe Ssortingng définie, est-ce que je peux utiliser == et! = Sans les définir? ou cela ne s’applique qu’à char []?

Modifier:
On dirait que j’ai mélangé le char [] de C avec la classe std :: ssortingng C ++. OK, l’ancienne question s’applique toujours. Quelques questions suivies comme ci-dessous:
Mes programmes ont défini char [] variables, mais comparés à l’opérateur “==”. Cela semblait du travail. Ce sont des chaînes de style C, mais fonctionnent avec “==”. Est-ce que le compilateur les a automatiquement convertis en std :: ssortingng pour que les programmes fonctionnent?

Edit2:
Voici un exemple de travail.

if(name == "") return; 

où “name” est un élément de la classe MySsortingng. Il a un construtor avec un paramètre char *.
MySsortingng a une fonction publique data (), elle retourne un pointeur de chaîne char * C-style.
Alors, est-ce que je compare les objects MySsortingng? ou des chaînes de style C?
Sans surcharge “! =” Moi-même, puis-je faire quelque chose comme ci-dessous?

 if( name.data() != somes_[i].data() ) .... 

“Cela signifie-t-il que C ++ traite de la chaîne ( char [] ) naturellement avec == et != ?”

Non Il est faux de comparer des chaînes de style C (c’est-à-dire char[] ou char* ) entre elles avec == ou != (En C et C ++), car vous finirez par comparer des pointeurs plutôt que des chaînes.

En C ++, il est possible de comparer std::ssortingng object std::ssortingng avec une chaîne de style C ou un autre object std::ssortingng raison de l’ operator== et de l’ operator!= : De std::ssortingng

 std::ssortingng str1("abc"), str2("def"); if (str1 != str2 && str1 == "abc") std::cout << "Yep, I got it."; 

Cela signifie-t-il que C ++ traite avec ssortingng (char []) naturellement avec == et! =?

Non; "aaa" == "aaa" convertira les littéraux de chaîne en char* comme d’habitude et comparera les valeurs du pointeur. Cependant, la plupart des implémentations de C et C ++ dédupliqueront les données littérales de chaîne, au moins dans un fichier object, afin que ces pointeurs soient les mêmes. Ceci n’est pas garanti par la norme, mais est largement implémenté.

En d’autres termes, C ++ ne diffère pas de C à cet égard et comparer les valeurs char* cette manière ne vaut pas mieux que de le faire en C.

Est-ce que le compilateur les a automatiquement convertis en std :: ssortingng pour que les programmes fonctionnent?

std::ssortingng a surchargé les opérateurs de comparaison fonctionnant avec char* . Si vous comparez un caractère char* avec un std::ssortingng un de ceux-ci sera utilisé.

 char const *s = "aaa"; std::ssortingng t = "aaa"; s == t; // uses overloaded operator== to compare ssortingng values. 

http://en.cppreference.com/w/cpp/ssortingng/basic_ssortingng/operator_cmp

 template< class CharT, class traits, class Alloc > bool operator==( const CharT* lhs, const basic_ssortingng& rhs ); 

N’utilisez pas! = Ou! = Pour comparer des chaînes de style C (char * ou char []).

Si vous êtes sûr que les chaînes sont terminées par null, utilisez std :: strcmp (). Si vous n’êtes pas absolument à 100% POSITIF qu’ils sont terminés par null, utilisez std :: strncmp () pour les comparer.

Si l’une de vos chaînes est un std :: ssortingng, vous pouvez utiliser operator == ou operator! =.

[édité en réponse au commentaire de barnes53]