CString
Przekazywanie argumentów
W tym artykule wyjaśniono, jak przekazywać CString
obiekty do funkcji i jak zwracać CString
obiekty z funkcji.
CString
Konwencje przekazywania argumentów
Podczas definiowania interfejsu klasy należy określić konwencję przekazywania argumentów dla funkcji składowych. Istnieją pewne standardowe reguły przekazywania i zwracania CString
obiektów. Jeśli przestrzegasz reguł opisanych w artykule Ciągi jako dane wejściowe funkcji i ciągi jako dane wyjściowe funkcji, będziesz mieć wydajny, poprawny kod.
Ciągi jako dane wejściowe funkcji
Najbardziej wydajnym i bezpiecznym sposobem użycia CString
obiektu w wywoływanych funkcjach jest przekazanie CString
obiektu do funkcji. Pomimo nazwy CString
obiekt nie przechowuje ciągu wewnętrznie jako ciąg w stylu C, który ma NULL
terminator. CString
Zamiast tego obiekt zachowuje staranne śledzenie liczby znaków, które zawiera. Po CString
podaniu LPCTSTR
wskaźnika do NULL
-terminated ciąg jest niewielką ilością pracy, która może stać się znacząca, jeśli kod musi to zrobić stale. Wynik jest tymczasowy, ponieważ każda zmiana CString
zawartości unieważnia stare kopie LPCTSTR
wskaźnika.
W niektórych przypadkach warto podać ciąg w stylu C. Na przykład może wystąpić sytuacja, w której wywoływana funkcja jest zapisywana w języku C i nie obsługuje obiektów. W takim przypadku przesuń CString
parametr na LPCTSTR
wartość , a funkcja pobierze ciąg -terminated w stylu NULL
języka C. Możesz również przejść w innym kierunku i utworzyć CString
obiekt przy użyciu CString
konstruktora, który akceptuje parametr ciągu w stylu C.
Jeśli zawartość ciągu ma zostać zmieniona przez funkcję, zadeklaruj parametr jako niekonstantego CString
odwołania (CString&
).
Ciągi jako dane wyjściowe funkcji
Zazwyczaj można zwracać CString
obiekty z funkcji, ponieważ CString
obiekty są zgodne z semantykami wartości, takimi jak typy pierwotne. Aby zwrócić ciąg tylko do odczytu, użyj odwołania stałego CString
(const CString&
). Poniższy przykład ilustruje użycie parametrów i typów zwracanych CString
:
class CName : public CObject
{
private:
CString m_firstName;
TCHAR m_middleInit;
CString m_lastName;
public:
CName() {}
void SetData(LPCTSTR fn, const TCHAR mi, LPCTSTR ln)
{
m_firstName = fn;
m_middleInit = mi;
m_lastName = ln;
}
void GetData(CString& cfn, TCHAR& mi, CString& cln)
{
cfn = m_firstName;
mi = m_middleInit;
cln = m_lastName;
}
CString GetLastName()
{
return m_lastName;
}
};
CName name;
CString last, first;
TCHAR middle;
name.SetData(_T("John"), 'Q', _T("Public"));
ASSERT(name.GetLastName() == _T("Public"));
name.GetData(first, middle, last);
ASSERT((first == _T("John")) && (last == _T("Public")));