web-dev-qa-db-fra.com

Qu'est-ce que `CString`?

Pourquoi est-ce que je vois du code utilisant CStrings déclaré différemment.

Certains utilisent ce format

char a_c_string [];

Alors que d'autres utilisent

CString another_c_string;

Y a-t-il une différence? Toutes les références que j'ai trouvées sur CStrings le déclarent comme je l'ai fait dans le premier exemple, je ne l'ai vu que faire l'inverse sur les forums et autres où les gens donnent des exemples.

18
user1768079

CString n'est ni un type C ni un type C++. Il semble que ce soit une invention de Microsoft qui est essentiellement une alternative à std::string:

  • CString les objets peuvent croître à la suite d'opérations de concaténation.
  • CString les objets suivent la "sémantique des valeurs". Considérez un objet CString comme une chaîne réelle, pas comme un pointeur vers une chaîne.
  • Vous pouvez librement substituer CString objets à const char* et LPCTSTR arguments de fonction.
  • Un opérateur de conversion donne un accès direct aux caractères de la chaîne sous la forme d'un tableau de caractères en lecture seule (une chaîne de style C).

Je recommande de l'ignorer, afin que:

(a) les gens savent de quoi vous parlez;
(b) votre code est portable;
. quelques gars dans une pièce au bureau d'une entreprise ).

Il ne sera disponible que lorsque vous programmez avec Microsoft Visual C++ , ce qui est considérablement limitant.

31

De nombreux frameworks GUI ont leur propre classe de chaînes. par exemple. QT a QString , wxWindows a wxString . Dans ce cas, MFC a la CString. Il est ensuite pratique et logique d'utiliser CString dans le contexte du code gui MFC, car vous êtes déjà fortement tributaire de Visual C++ et la portabilité du code ne sera pas envisagée. Je ferais attention aux déclarations générales disant de l'ignorer parce que ce n'est pas standard - tout dépend du contexte.

22
acraig5075

Juste au cas où cela serait source de confusion: le "C" dans "CString" n'est qu'un préfixe que toutes les classes du MFC ont. Le MFC est une bibliothèque C++ de Microsoft encapsulant l'API win32. Cette classe de chaînes n'a pas grand-chose à voir avec les "chaînes C", qui sont utilisées pour décrire les fonctions de gestion de chaînes fournies par le langage C. Le langage C ne fournit que des fonctions de gestion de chaîne qui fonctionnent sur un pointeur vers le tableau de caractères représentant la chaîne et elles nécessitent que le dernier caractère soit un NUL (aka NUL terminé ou terminé par zéro). Notez que C++ lui-même a également une classe de chaîne std::string (en fait, il y a aussi std :: wstring et le modèle std :: basic_string, mais en tant que débutant, vous pouvez les ignorer en toute sécurité).

9
Ulrich Eckhardt