曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4099|回复: 0
打印 上一主题 下一主题

LPCTSTR 和 CSTRING 对象

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2014-10-12 14:43:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-29 11:59 , Processed in 0.061245 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表