C++字符串完全指南(2) - STL和ATL类

转载 2004年07月14日 10:26:00

C++字符串完全指南(2) - STL和ATL类

作者: 翻译:连波
Thursday, November 21 2002 3:53 PM
STL类
 
STL只有一个字符串类,即basic_string。basic_string管理一个零结尾的字符数组。字符类型由模板参数决定。通常,basic_string被处理为不透明对象。可以获得一个只读指针来访问缓冲区,但写操作都是由basic_string的成员函数进行的。

basic_string预定义了二个特例:string,含有char类型字符;which,含有wchar_t类型字符。没有内建的TCHAR特例,可用下面的代码实现:

// 特例化
typedef basic_string tstring; // TCHAR字符串
// 构造
string str = "char string"; // 从LPCSTR构造
wstring wstr = L"wide char string"; // 从LPCWSTR构造
tstring tstr = _T("TCHAR string"); // 从LPCTSTR构造
// 数据萃取
LPCSTR psz = str.c_str(); // 指向str缓冲区的只读指针
LPCWSTR pwsz = wstr.c_str(); // 指向wstr缓冲区的只读指针
LPCTSTR ptsz = tstr.c_str(); // 指向tstr缓冲区的只读指针


与_bstr_t 不同,basic_string不能在字符集之间进行转换。但是如果一个构造函数接受相应的字符类型,可以将由c_str()返回的指针传递给这个构造函数。例如:

// 从basic_string构造_bstr_t
_bstr_t bs1 = str.c_str();  // 从LPCSTR构造 _bstr_t
_bstr_t bs2 = wstr.c_str(); // 从LPCWSTR构造 _bstr_t

ATL类
CComBSTR
CComBSTR 是ATL的BSTR包装类。某些情况下比_bstr_t 更有用。最主要的是,CComBSTR允许操作隐含BSTR。就是说,传递一个CComBSTR对象给COM方法时,CComBSTR对象会自动管理BSTR内存。例如,要调用下面的接口函数:

// 简单接口
struct IStuff : public IUnknown
{
  // 略去COM程序...
  STDMETHOD(SetText)(BSTR bsText);
  STDMETHOD(GetText)(BSTR* pbsText);
};

CComBSTR 有一个BSTR操作方法,能将BSTR直接传递给SetText()。还有一个引用操作(operator &)方法,返回BSTR*,将BSTR*传递给需要它的有关函数。

CComBSTR bs1;
CComBSTR bs2 = "new text";
pStuff->GetText ( &bs1 );       // ok, 取得内部BSTR地址
  pStuff->SetText ( bs2 );        // ok, 调用BSTR转换
  pStuff->SetText ( (BSTR) bs2 ); // cast ok, 同上


CComBSTR有类似于 _bstr_t 的构造函数。但没有内建MBCS字符串的转换函数。可以调用ATL宏进行转换。

// 构造
CComBSTR bs1 = "char string"; // 从LPCSTR构造
CComBSTR bs2 = L"wide char string"; // 从LPCWSTR构造
CComBSTR bs3 = bs1; // 拷贝CComBSTR
CComBSTR bs4;
bs4.LoadString ( IDS_SOME_STR ); // 从字符串表加载
// 数据萃取
BSTR bstr1 = bs1; // 返回内部BSTR,但不可修改!
BSTR bstr2 = (BSTR) bs1; // cast ok, 同上
BSTR bstr3 = bs1.Copy(); // 拷贝bs1, 返回BSTR
BSTR bstr4;
bstr4 = bs1.Detach(); // bs1不再管理它的BSTR
// ...
SysFreeString ( bstr3 );
SysFreeString ( bstr4 );


上面的最后一个示例用到了Detach()方法。该方法调用后,CComBSTR对象就不再管理它的BSTR或其相应内存。所以bstr4就必须调用SysFreeString()。

最后讨论一下引用操作符(operator &)。它的超越使得有些STL集合(如list)不能直接使用CComBSTR。在集合上使用引用操作返回指向包容类的指针。但是在CComBSTR上使用引用操作,返回的是BSTR*,不是CComBSTR*。不过可以用ATL的CAdapt类来解决这个问题。例如,要建立一个CComBSTR的队列,可以声明为:

  std::list< CAdapt<CComBSTR>> bstr_list;
CAdapt 提供集合所需的操作,是隐含于代码的。这时使用bstr_list 就象在操作一个CComBSTR队列。

CComVariant
CComVariant 是VARIANT的包装类。但与 _variant_t 不同,它的VARIANT不是隐含的,可以直接操作类里的VARIANT成员。CComVariant 提供多种构造函数和多类型操作。这里只介绍与字符串有关的操作。

// 构造
CComVariant v1 = "char string";       // 从LPCSTR构造
CComVariant v2 = L"wide char string"; // 从LPCWSTR构造
CComBSTR bs1 = "BSTR bob";
CComVariant v3 = (BSTR) bs1;          // 从BSTR拷贝
// 数据萃取
CComBSTR bs2 = v1.bstrVal;            // 从VARIANT提取BSTR

跟_variant_t 不同,CComVariant没有不同VARIANT类型之间的转换操作。必须直接操作VARIANT成员,并确定该VARIANT的类型无误。调用ChangeType()方法可将CComVariant数据转换为BSTR。

CComVariant v4 = ... // 从某种类型初始化 v4
CComBSTR bs3;
if ( SUCCEEDED( v4.ChangeType ( VT_BSTR ) ))
    bs3 = v4.bstrVal;

跟 _variant_t 一样,CComVariant不能直接转换为MBCS字符串。要建立一个过渡的_bstr_t 变量,用其它提供转换Unicode到MBCS的类函数,或ATL转换宏来转换。

C++ STL,ATL,WTL之间的联系和区别

STL即 Standard Template Library (标准模板库) STL是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和Davi...
  • xdrt81y
  • xdrt81y
  • 2013年12月05日 16:09
  • 11285

C++字符串完全指南

C++字符串完全指南 - Win32字符编码(一) 前言 字符串的表现形式各异,象TCHAR,std::string,BSTR等等,有时还会见到怪怪的用_tcs起头的宏。这个指...
  • a904003695
  • a904003695
  • 2016年04月17日 02:51
  • 857

STL,ATL,WTL之间的联系和区别

一、STL即 Standard Template Library (标准模板库)       STL是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Le...
  • wangwenjing90
  • wangwenjing90
  • 2013年05月14日 14:44
  • 3967

CRT、ATL、MFC 三者介绍和关系

转载地址:http://hi.baidu.com/catro/item/115099c46917edc4994aa0ed CRT原先是指Microsoft开发的C Runtime Library,用...
  • memeai
  • memeai
  • 2014年02月27日 10:46
  • 2456

[经典面试题][百度]c++实现STL中的string类

题目请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。代码/*-------------------------------------...
  • SunnyYoona
  • SunnyYoona
  • 2015年03月31日 22:41
  • 2230

《Boost程序库完全开发指南》

[转]读《Boost程序库完全开发指南》 原文: http://dearymz.blog.163.com/blog/static/2056574201141883716608/   第1章 Boo...
  • cherish_2012
  • cherish_2012
  • 2014年03月13日 17:49
  • 1364

【C++】字符串和数值类型的相互转化(借助STL)

在C++编程中有时会遇到字符串和数字的相互转化,以前学习的时候老师喜欢将这种转化当成作业,要我们写函数实现。但是实际为了方便准确还是会优先使用STL来完成。      在 C 标准库中提供了字符串到数...
  • xiaohui_hubei
  • xiaohui_hubei
  • 2014年03月14日 17:34
  • 3111

ATL字符串转换宏

有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏,你相信吗? 头文件 d:/program files/microsoft visual ...
  • u011135902
  • u011135902
  • 2016年07月20日 14:21
  • 780

MFC、WTL 、ATL、STL联系与区别

MFC、WTL 、ATL、STL联系与区别    这个要先从C++和VC++说起!    c++是一门语言,它与平台无关。只要能提供c++编译器(或者交叉编译器)的平台,就能用c++编程。...
  • u011686361
  • u011686361
  • 2014年09月23日 20:40
  • 1152

C++ STL之正则表达式

正则表达式是C++11标准库中新加入的强大工具。正则表达式是一种用于字符串处理的微型语言,适用于一些与字符串相关的操作。C++11包含了对以下几种语法的支持:ECMAScript、basic、exte...
  • u011475134
  • u011475134
  • 2017年07月27日 00:33
  • 538
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++字符串完全指南(2) - STL和ATL类
举报原因:
原因补充:

(最多只允许输入30个字)