CString
Передача аргументов
В этой статье объясняется, как передавать CString
объекты в функции и как возвращать CString
объекты из функций.
CString
Соглашения о передаче аргументов
При определении интерфейса класса необходимо определить соглашение о передаче аргументов для функций-членов. Существуют некоторые стандартные правила передачи CString
и возврата объектов. Если следовать правилам, описанным в разделе "Строки как входные данные функции" и "Строки" в качестве выходных данных функций, вы будете иметь эффективный, правильный код.
Строки в качестве входных данных функции
Самый эффективный и безопасный способ использования объекта в вызываемой CString
функции — передать CString
объект в функцию. Несмотря на имя, CString
объект не сохраняет строку внутри себя как строку в стиле C, которая имеет NULL
терминатор. Вместо этого CString
объект тщательно отслеживает количество символов, которые у него есть. Если CString
указать указатель на NULL
строку с завершением, это небольшая работа, которая может стать значительнойLPCTSTR
, если код должен выполнять его постоянно. Результат является временным, так как любое изменение CString
содержимого LPCTSTR
делает недействительными старые копии указателя.
В некоторых случаях имеет смысл предоставить строку в стиле C. Например, может возникнуть ситуация, когда вызываемая функция записывается в C и не поддерживает объекты. В этом случае принудительная CString
к параметру LPCTSTR
, а функция получит строку в стиле NULL
C. Вы также можете перейти в другое направление и создать CString
объект с помощью конструктора CString
, который принимает параметр строки в стиле C.
Если содержимое строки должно быть изменено функцией, объявите параметр как неконстантную CString
ссылку (CString&
).
Строки в виде выходных данных функций
Как правило, можно возвращать CString
объекты из функций, так как CString
объекты следуют семантике значений, например примитивным типам. Чтобы вернуть строку только для чтения, используйте константную CString
ссылку (const CString&
). В следующем примере показано использование 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")));