曲径通幽论坛

标题: LPCTSTR 和 CSTRING 对象 [打印本页]

作者: beyes    时间: 2014-10-12 14:43
标题: LPCTSTR 和 CSTRING 对象
SetDlgItemText() 用来在控件(如静态文本控件)上输出文本,其原型是:
  1. BOOL SetDlgItemText(    int nID,    LPCTSTR lpszString  ) throw();
复制代码

第 2 个参数 lpszString 是个字符串,或是一个字符指针。但是我们在这里也可以填入 CString 对象,为什么?下面来分析一下。
首先,LPCTSTR 是由 typedef 来定义的:
  1. typedef LPCWSTR LPCTSTR
复制代码


在 atlsimpstr.h 中有如下定义:
[C++] 纯文本查看 复制代码
template< typename BaseType = char >
class ChTraitsBase
{
public:
        typedef char XCHAR;
        typedef LPSTR PXSTR;
        typedef LPCSTR PCXSTR;
        typedef wchar_t YCHAR;
        typedef LPWSTR PYSTR;
        typedef LPCWSTR PCYSTR;
};

这是个模板类,定义了字符及相关指针的基本类型。这里,LPCWSTR 和 PCYSTR是等价。

同样在 atlsimpstr.h 中有的类 CSimpleStringT 中有:
typedef typename CThisSimpleString::PCYSTR PCYSTR;

也就是说,在该类中,PCXSTR 和在 ChTraitsBase 类中的 PCXSTR 是一样的东西。

由于 typedef 后面是要跟着一个明确的类型的,而 CThisSimpleString::PCYSTR 只是一个还未实例化的模板,因此编译器并不了解它到底是个什么类型,为了通知编译器这是个合法的类型,就使用了 typename 来防止编译器报错。

在 CSimpleStringT 中,我们找到了转换函数:
  1. operator PCXSTR() const throw()
  2. {
  3.   return( m_pszBuffer );
  4. }
复制代码

注意和构造函数的区别,构造函数可用于从某种类型到类类型的转换。如果要进行相反的转换,构造函数无能无力,只能用特殊的 C++ 运算符函数,即 转换函数

也就是说,当一个 CString 对象传递到给一个函数中的 LPCTSTR 参数中时,CString 对象会经由转换函数,将对象转换为 LPCTSTR 。






欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2