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