CString имеет много внутренних трюков, которые при передаче выглядят как обычные строки, например. к printf
функциям, несмотря на то, что на самом деле это класс - без необходимости приводить его к LPCTSTR
в списке аргументов, например, в случае varargs
(...
), например, printf
. Таким образом, попытка понять отдельный трюк или функцию в реализации CString - плохая новость. (Функция данных является внутренней функцией, которая получает «реальный» буфер, связанный со строкой.)
В нее входит книга, MFC Internals, и IIRC, книга Blaszczak, может коснуться ее.
РЕДАКТИРОВАТЬ: Что касается того, что выражение фактически переводит в терминах необработанного C ++: -
TCHAR* data() { return (TCHAR*)(&this[1]); };
здесь написано «представьте, что вы на самом деле первая запись в массиве элементов, выделенных вместе. Теперь второй элемент на самом деле не является CString
, это обычный NUL-концевой буфер с Unicode или обычными символами - то есть LPTSTR».
Еще один способ выразить то же самое:
TCHAR* data() { return (TCHAR*)(this + 1); };
Когда вы добавляете 1 к указателю на T, вы фактически добавляете 1 * sizeof в терминах необработанного адреса памяти. Таким образом, если CString находится в 0x00000010 с sizeof (CString) = 4, данные возвращают указатель на завершенный NUL массив буферов символов, начинающийся с 0x00000014
Но просто понимание одной вещи вне контекста не обязательно является хорошей идеей.
Зачем вам нужно , чтобы знать?