MFC CString Конструктор действий - PullRequest
0 голосов
/ 15 ноября 2018
CString Str1 = "ABC";
CString Str2 = Str1 + "123"; // Understandable
CString Str3 = "123" + Str1; // How does it work? Is there data overriding?

Используется ли в последней операции перегрузка оператора CString '+', хотя Str1 находится справа от '+'?Спасибо за ответ.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Шаблон класса MFC / ATL CStringT предоставляет следующие оператор + операторы в качестве свободных функций:

friend CStringT operator+(const CStringT& str1, const CStringT& str2);
friend CStringT operator+(const CStringT& str1, PCXSTR psz2);
friend CStringT operator+(PCXSTR psz1, const CStringT& str2,);
friend CStringT operator+(char ch1, const CStringT& str2,);
friend CStringT operator+(const CStringT& str1, char ch2);
friend CStringT operator+(const CStringT& str1, wchar_t ch2);
friend CStringT operator+(wchar_t ch1, const CStringT& str2);

В операторе CString Str3 = "123" + Str1; нельзя использовать член класса, поскольку в левой части выражения + нет объекта класса, а также пользовательского оператора неявного преобразования. Он должен вызывать свободную функцию и использовать перегрузку, принимающую аргумент PCXSTR .

Обратите внимание, что это означает, что ваш проект настроен на использование кодировки ANSI (MBCS). Это обычно не желательно. Вместо этого используйте Unicode, либо задав соответствующие символы препроцессора (подробности см. Работа со строками ), либо явно используя версии широких символов (CStringW) и добавляя строковые литералы с L (L"123"). * * тысячу двадцать-один

0 голосов
/ 15 ноября 2018
CString Str3 = "123" + Str1;

Здесь вы можете увидеть различные перегрузки operator+, которые поддерживает CString, и одна из них включает в себя приведенный выше пример.

Примечание: Объединение двух строковых литералов, как показано ниже, не поддерживается, поскольку это эквивалентно добавлению двух указателей.

CString Str3 = "123" + "456"
...