CString
Předávání argumentů
Tento článek vysvětluje, jak předat CString
objekty funkcím a jak vrátit CString
objekty z funkcí.
CString
Konvence předávání argumentů
Při definování rozhraní třídy je nutné určit konvenci předávání argumentů pro členské funkce. Existují některá standardní pravidla pro předávání a vracení CString
objektů. Pokud dodržujete pravidla popsaná v řetězcích jako vstupy funkcí a řetězce jako výstupy funkce, budete mít efektivní a správný kód.
Řetězce jako vstupy funkcí
Nejúčinnějším a nejbezpečnějším způsobem použití objektu CString
ve volaným funkcím je předání CString
objektu do funkce. I přes název CString
objekt neukládá řetězec interně jako řetězec ve stylu jazyka C, který má NULL
ukončovací znak. CString
Místo toho objekt pečlivě sleduje počet znaků, které má. LPCTSTR
Poskytnutí CString
ukazatele na NULL
řetězec -terminated je malé množství práce, které může být významné, pokud to váš kód musí dělat neustále. Výsledek je dočasný, protože jakákoli změna CString
obsahu zneplatní staré kopie LPCTSTR
ukazatele.
V některých případech dává smysl poskytnout řetězec ve stylu jazyka C. Může se například jednat o situaci, kdy je volána funkce napsaná v jazyce C a nepodporuje objekty. V tomto případě převede CString
parametr na LPCTSTR
a funkce získá řetězec -terminated ve stylu NULL
C. Můžete také přejít do jiného směru a vytvořit CString
objekt pomocí CString
konstruktoru, který přijímá parametr řetězce ve stylu C.
Pokud je obsah řetězce změněn funkcí, deklarujte parametr jako nekonstantní CString
odkaz (CString&
).
Řetězce jako výstupy funkce
Objekty z funkcí lze obvykle vracet CString
, protože CString
objekty sledují sémantiku hodnot, jako jsou primitivní typy. Pokud chcete vrátit řetězec jen pro čtení, použijte konstantní CString
odkaz (const CString&
). Následující příklad ukazuje použití parametrů a návratových CString
typů:
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")));