Zarządzanie danymi ciągów
Język Visual C++ oferuje kilka sposobów zarządzania danymi ciągów:
Manipulowanie ciągami do pracy z ciągami w stylu
NULL
CFunkcje interfejsu API Win32 do zarządzania ciągami
Klasa MFC
CStringT
, która zapewnia elastyczne, możliwe do zmiany rozmiaru obiekty ciągówKlasa
CStringT
, która udostępnia obiekt ciągu niezależnego od MFC z taką samą funkcjonalnością jakCString
Prawie wszystkie programy działają z danymi ciągów. Klasa MFC CString
jest często najlepszym rozwiązaniem do elastycznej obsługi ciągów. Począwszy od wersji 7.0, CString
można używać w programach niezależnych od MFC lub MFC. Zarówno biblioteka czasu wykonywania, jak i CString
ciągi obsługują ciągi zawierające znaki wielobajtowe (szerokie), jak w programowaniu Unicode lub MBCS.
W tym artykule opisano usługi ogólnego przeznaczenia, które biblioteka klas zapewnia związane z manipulowaniem ciągami. Tematy omówione w tym artykule obejmują:
CStringT
Klasa Class zapewnia obsługę manipulowania ciągami. Ma on na celu zastąpienie i rozszerzenie funkcjonalności zwykle zapewnianej przez pakiet ciągów biblioteki uruchomieniowej języka C. Klasa CString
dostarcza funkcje składowe i operatory do uproszczonej obsługi ciągów, podobnie jak te znalezione w warstwie Podstawowa. Klasa udostępnia również konstruktory i operatory do konstruowania, przypisywania i porównywania CString
typów danych ciągów języka C++. Ponieważ CString
nie pochodzi z CObject
klasy , można używać CString
obiektów niezależnie od większości biblioteki klas programu Microsoft Foundation (MFC).
CString
obiekty są zgodne z "semantyka wartości". CString
Obiekt reprezentuje unikatową wartość. Można traktować CString
jako rzeczywisty ciąg, a nie jako wskaźnik do ciągu.
CString
Obiekt reprezentuje sekwencję zmiennej liczby znaków. CString
obiekty można traktować jako tablice znaków.
Unicode i MBCS zapewniają przenośność
W przypadku MFC w wersji 3.0 lub nowszej MFC, w tym CString
, jest włączona zarówno dla zestawów znaków Unicode, jak i wielobajtowych (MBCS). Ta obsługa ułatwia pisanie aplikacji przenośnych, które można tworzyć dla znaków Unicode lub ANSI. Aby włączyć tę przenośność, każdy znak w CString
obiekcie ma typ TCHAR
, który jest zdefiniowany tak, jakby wchar_t
symbol _UNICODE
był definiowany podczas kompilowania aplikacji lub tak, jakby char
nie. Znak wchar_t
ma szerokość 16 bitów. Funkcja MBCS jest włączona w przypadku kompilacji za pomocą zdefiniowanego symbolu _MBCS
. Sam MFC jest tworzony za pomocą symbolu _MBCS
(dla bibliotek NAFX) lub symbolu _UNICODE
(dla bibliotek UAFX) zdefiniowanego.
Uwaga
Przykłady CString
w tym i towarzyszących artykułach w ciągach pokazują ciągi literału prawidłowo sformatowane dla przenośności Unicode przy użyciu _T
makra, które tłumaczy ciąg literału na formularz:
L"literal string"
Uwaga
który kompilator traktuje jako ciąg Unicode. Na przykład następujący kod:
CString strName = _T("Name");
Uwaga
jest tłumaczony jako ciąg Unicode, jeśli _UNICODE
jest zdefiniowany lub jako ciąg ANSI, jeśli nie. Aby uzyskać więcej informacji, zobacz artykuł Obsługa zestawów znaków Unicode i wielobajtowych (MBCS).
Obiekt CString
może przechowywać maksymalnie INT_MAX
(2147 483 647 znaków). Typ danych służy do pobierania TCHAR
lub ustawiania pojedynczych znaków wewnątrz CString
obiektu. W przeciwieństwie do tablic znaków klasa CString
ma wbudowaną funkcję alokacji pamięci. CString
Dzięki temu obiekty mogą automatycznie rosnąć w razie potrzeby (oznacza to, że nie trzeba martwić się o powiększanie CString
obiektu w celu dopasowania dłuższych ciągów).
CStrings
i const char
wskaźniki
CString
Obiekt może również działać jak ciąg w stylu literału C (PCXSTR
znak , który jest taki sam, jak const char*
w przypadku nie w formacie Unicode). Operator CSimpleStringT::operator PCXSTR
konwersji umożliwia CString
wolne zastępowanie obiektów wskaźnikami znaków w wywołaniach funkcji. Konstruktor CString(LPCWSTR pszSrc)
umożliwia zastępowanie wskaźników znaków dla CString
obiektów.
Nie podjęto próby składania CString
obiektów. W przypadku tworzenia dwóch CString
obiektów zawierających Chicago
na przykład znaki w Chicago
obiekcie są przechowywane w dwóch miejscach. (Może to nie być prawdą w przyszłych wersjach MFC, więc nie należy od niego zależeć).
Uwaga
Użyj funkcji składowych CSimpleStringT::GetBuffer
i CSimpleStringT::ReleaseBuffer
, jeśli musisz uzyskać bezpośredni dostęp do CString
elementu jako wskaźnika niekonstantego do znaku.
Uwaga
CStringT::AllocSysString
Używanie funkcji składowych i CStringT::SetSysString
do przydzielania i ustawiania BSTR
obiektów używanych w usłudze Automation (wcześniej nazywanej automatyzacją OLE).
Uwaga
Jeśli to możliwe, przydziel CString
obiekty na ramce, a nie na stercie. Pozwala to zaoszczędzić pamięć i uprościć przekazywanie parametrów.
Klasa CString
nie jest implementowana jako klasa kolekcji biblioteki klas programu Microsoft Foundation, chociaż CString
obiekty z pewnością mogą być przechowywane jako elementy w kolekcjach.
CString
Zliczanie odwołań
Od MFC w wersji 4.0, gdy CStringT
obiekty klasy są kopiowane, MFC zwiększa liczbę odwołań zamiast kopiować dane. Dzięki temu przekazywanie parametrów według wartości i zwracanie CString
obiektów według wartości jest bardziej wydajne. Te operacje powodują wywoływanie konstruktora kopiowania, czasami więcej niż raz. Zwiększenie liczby odwołań zmniejsza obciążenie dla tych typowych operacji i sprawia, że użycie CString
bardziej atrakcyjnej opcji.
Gdy każda kopia zostanie zniszczona, liczba odwołań w oryginalnym obiekcie zostanie zdekrementowana. Oryginalny CString
obiekt nie zostanie zniszczony, dopóki liczba odwołań nie zostanie zmniejszona do zera.
Możesz użyć funkcji CSimpleStringT::LockBuffer
składowych CString
i CSimpleStringT::UnlockBuffer
wyłączyć lub włączyć zliczanie odwołań.