转载:C++字符串完全指南(2) - MFC类-CString

来源:互联网 发布:windows 3d图形编程 编辑:程序博客网 时间:2024/03/28 22:36

evers的专栏

  CSDN |  社区 |  技术中心 |  BLOG首页 |  我的首页 |  个人档案 |  联系作者 |  聚合  |   |  搜索 |  登录
  4篇原创: 0篇翻译: 25篇转载: 8013次点击: 24个评论: 0个Trackbacks

文章

  • 软件开发(RSS)

收藏

  • C/C++基础
  • VC/MFC
  • 编译调试
  • 程序架构
  • 网络技术
  • 用人之道
  • 杂类编程

相册

  • 程序开发

讨论关注

  • 一位老工程师的终告
  • 循环队列的实现(Queue, C++版)
  • 我看C++/CLI和.NET

网友文摘

  • linux编程step by step
  • X86汇编语言学习手记
  • 体验下一代微软平台开发Visual Studio 2005
  • 如何编写一个文件捆绑工具
  • 小四的故事
  • 程序员如何做SOHO一族接私单做呢?
  • 设计模式的有趣解释-追MM
  • 谁动了我的指针?
  • 高效屏幕录制

友情联接

  • SOHU之小虫的窝
  • ZCLinux
  • Zeng Yi's Blog
  • 小花空间
  • 微软Harry Pierson
  • 微软Steve cook
  • 微软袁峰
  • 纯C论坛
  • 绿盟站点
  • 网络安全焦点网
  • 访谈类之孟岩

存档

  • 2004年11月(4)


作者tag:c/c++基础 
<<文件结构(摘录) | 重载new,delete跟踪调试程序 >>

 C++字符串完全指南 - MFC类
C++字符串完全指南(2) - MFC类 作者: 连波 类别: VC/VC.NET 日期: 2003-1-6 14:29:21  
C++字符串完全指南(2) - MFC类


MFC类

CString

MFC 的CString含有TCHAR,它的实际字符类型取决于预处理标记的设置。通常,CString象STL字符串一样是不透明对象,只能用CString 的方法来修改。CString比STL字符串更优越的是它的构造函数接受MBCS和Unicode字符串。并且可以转换为LPCTSTR,因此可以向接受 LPCTSTR的函数直接传递CString对象,不必调用c_str()方法。

// 构造
CString s1 = "char string"; // 从LPCSTR构造
CString s2 = L"wide char string"; // 从LPCWSTR构造
CString s3 ( ' ', 100 ); // 预分配100字节,填充空格
CString s4 = "New window text";
// 可以在LPCTSTR处使用CString:
SetWindowText ( hwndSomeWindow, s4 );
// 或者,显式地做强制类型转换:
SetWindowText ( hwndSomeWindow, (LPCTSTR) s4 );


也可以从字符串表加载字符串。CString通过LoadString()来构造对象。用Format()方法可有选择地从字符串表读取一定格式的字符串。

// 从字符串表构造/加载
CString s5 ( (LPCTSTR) IDS_SOME_STR ); // 从字符串表加载
CString s6, s7;
// 从字符串表加载
s6.LoadString ( IDS_SOME_STR );
// 从字符串表加载打印格式的字符串
s7.Format ( IDS_SOME_FORMAT, "bob", nSomeStuff, ... );

第一个构造函数看上去有点怪,但它的确是文档标定的字符串加载方式。

注 意,CString只允许一种强制类型转换,即强制转换为LPCTSTR。强制转换为LPTSTR (非常量指针)是错误的。按照老习惯,将CString强制转换为LPTSTR只能伤害自己。有时在程序中没有发现出错,那只是碰巧。转换到非常量指针的 正确方法是调用GetBuffer()方法。

下面以往队列加入元素为例说明如何正确地使用CString:

CString str = _T("new text");
LVITEM item = {0};
item.mask = LVIF_TEXT;
item.iItem = 1;
item.pszText = (LPTSTR)(LPCTSTR) str; // 错!
item.pszText = str.GetBuffer(0); // 正确
ListView_SetItem ( &item );
str.ReleaseBuffer(); // 将队列返回给str

pszText成员是LPTSTR,一个非常量指针,因此要用str的GetBuffer()。GetBuffer()的参数是CString分配的最小缓冲区。如果要分配一个1K的TCHAR,调用GetBuffer(1024)。参数为0,只返回指向字符串的指针。

上 面示例的出错语句可以通过编译,甚至可以正常工作,如果恰好就是这个类型。但这不证明语法正确。进行非常量的强制类型转换,打破了面向对象的封装原则,并 逾越了CString的内部操作。如果你习惯进行这样的强制类型转换,终会遇到出错,可你未必知道错在何处,因为你到处都在做这样的转换,而代码也都能运 行。


知道为什么人们总在抱怨有缺陷的软件吗?不正确的代码就臭虫的滋生地。然道你愿意编写明知有错的代码让臭虫有机可乘?还是花些时间学习CString的正确用法让你的代码能够100%的正确吧。

CString还有二个函数能够从CString中得到BSTR,并在必要时转换成Unicode。那就是AllocSysString()和SetSysString()。除了SetSysString()使用BSTR*参数外,二者一样。

// 转换成BSTR
CString s5 = "Bob!";
BSTR bs1 = NULL, bs2 = NULL;
bs1 = s5.AllocSysString();
s5.SetSysString ( &bs2 );
// ...
SysFreeString ( bs1 );
SysFreeString ( bs2 );

COleVariant 与CComVariant 非常相似。COleVariant 继承于VARIANT,可以传递给需要VARIANT的函数。但又与CComVariant 不同,COleVariant 只有一个LPCTSTR的构造函数,不提供单独的LPCSTR和LPCWSTR的构造函数。在大多情况下,没有问题,因为总是愿意把字符串处理为 LPCTSTR。但你必须知道这点。COleVariant 也有接受CString的构造函数。

// 构造
CString s1 = _T("tchar string");
COleVariant v1 = _T("Bob"); // 从LPCTSTR构造
COleVariant v2 = s1; // 从CString拷贝

对于CComVariant,必须直接处理VARIANT成员,用ChangeType()方法在必要时将其转换为字符串。但是,COleVariant::ChangeType() 在转换失败时会抛出异常,而不是返回HRESULT的出错码。

// 数据萃取
COleVariant v3 = ...; // 从某种类型构造v3
BSTR bs = NULL;
try
{
v3.ChangeType ( VT_BSTR );
bs = v3.bstrVal;
}
catch ( COleException* e )
{
// 出错,无法转换
}
SysFreeString ( bs );


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=184223


[收藏到我的网摘]  evers发表于2004年11月17日 08:52:00

相关文章:
  • C++字符串完全指南(2) - MFC类 2005-08-09 extcsdn
  • 一篇关于CString类型转换的文章 2006-04-06 smstone
  • C++字符串完全指南(2) - 各种字符串类- CRT类 2005-01-04 i_like_cpp
  • C++字符串完全指引之二 —— 字符串封装类 2005-04-08 deltacat
  • CString 操作指南 2004-08-12 BestBear



特别推荐:
  • Rational软件交付平台免费下
    免费下载Rational软件交付平台(SDP)V7 显著改进IT 资产的生命周期和产品质量的管理
  • AIX 上的进程优先级与进程控制
    管理 AIX 系统上的进程 您必须了解进程和线程的定义以及二者之间的区别
  • 中国SOA应用大调查分析报告
    中国企业对SOA的投入快速增加 中国企业部署SOA还存在着一定的风险和挑战
  • Solaris10系统DTrace用法
    读完本文之后,读者将能够创建脚本,以收集运行中应用 DTrace是Sun Solaris内置的全面动态
  • 多核编程的几个难题及其应对策略(难题一)
    非常有用的实用资料
<<文件结构(摘录) | 重载new,delete跟踪调试程序 >>

没有评论。

发表评论

  大名: 网址: 评论 
   
 
原创粉丝点击