(_T("This is a test")); // Unicode-aware CString s = p;
CString s(p); 用这些方法可以轻松将常量字符串或指针转换成 CString。需要注意的是,字符的赋 值总是被拷贝到 CString 对象中去的,所以你可以象下面这样操作:
TCHAR * p = _T("Gray"); CString s(p); p = _T("Cat"); s += p; 结果字符串肯定是"GrayCat"。
CString 类还有几个其它的构造函数,但是这里我们不考虑它,如果你有兴趣可以自己查 看相关
文档。
事实上,CString 类的构造函数比我展示的要复杂,比如:
CString s = "This is a test"; 这是很草率的编码,但是实际上它在 Unicode 环境下能编译通过。它在运行时调用构 造函数的 MultiByteToWideChar 操作将 8 位字符串转换成 16 位字符
串。不管怎样,如 果 char * 指针是
网络上传输的 8 位数据,这种转换是很有用的。
CString 转化成 char* 之一:强制类型转换为 LPCTSTR;
这是一种略微硬性的转换,有关"正确"的做法,人们在认识上还存在许多混乱,正确 的使用方法有很多,但错误的使用方法可能与正确的使用方法一样多。 我们首先要了解 CString 是一种很特殊的 C++ 对象,它里面包含了三个值:一个指 向某个数据缓冲区的指针、一个是该缓冲中有效的字符记数以及一个缓冲区长度。有效字 符数的大小可以是从 0 到该缓冲最大长度值减 1 之间的任何数(因为字符串结尾有一个 NULL 字符)。字符记数和缓冲区长度被巧妙隐藏。 除非你做一些特殊的操作,否则你不可能知道给 CString 对象分配的缓冲区的长度。这
样,即使你获得了该 0 缓冲的地址,你也无法更改其中的内容,不能截短字符串,也 绝对 没有办法加长它的内容,否则第一时间就会看到溢出。 LPCTSTR 操作符 (或者更明确地说就是 TCHAR * 操作符) CString 类中被重载了 在 ,该操作符的定义是返回缓冲区的地址,因此,如果你需要一个指向 CString 的 字符串 指针的话,可以这样做:
CString s("GrayCat"); LPCTSTR p = s; 它可以正确地运行。这是由 C 语言的强制类型转化规则实现的。当需要强制类型转化 时 ,C++规测容许这种选择。比如,你可以将(浮点数)定义为将某个复数 (有一对浮点数 )进行强制类型转换后只返回该复数的第一个浮点数(也就是其实部)。可以象下面这样 :
Complex c(1.2f, 4.8f); float realpart = c; 如果(float)操作符定义正确的话,那么实部的的值应该是 1.2。 这种强制转化适合所有这种情况,例如,任何带有 LPCTSTR 类型参数的函数都会强 制 执行这种转换。 于是,你可能有这样一个函数(也许在某个你买来的 DLL 中):
BOOL DoSomethingCool(LPCTSTR s); 你象下面这样调用它:
CString file("c:\\myfiles\\coolstuff") BOOL result = DoSomethingCool(file); 它能正确运行。 因为 DoSomethingCool 函数已经说明了需要一个 LPCTSTR 类型的参 数,因此 LPCTSTR 被应用于该参数,在 MFC 中就是返回的串地址。
如果你要格式化字符串怎么办呢?
CString graycat("GrayCat"); CString s; s.Format("Mew! I love %s", graycat); 注意由于在可变参数
列表中的值(在函数说明中是以"..."表示的)并没有隐含一个强 制类型转换操作符。你会得到什么结果呢? 一个令人惊讶的结果,我们得到的实际结果串是