日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++字符串完全指南(2) - 各种字符串类- CRT类

發(fā)布時(shí)間:2025/3/15 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++字符串完全指南(2) - 各种字符串类- CRT类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C++字符串完全指南(2) - 各種字符串類- CRT類
_bstr_t


字符串包裝類

我已經(jīng)說明了字符串的各種類型,現(xiàn)在討論包裝類。對(duì)于每個(gè)包裝類,我都會(huì)說明它的對(duì)象構(gòu)造過程和如何轉(zhuǎn)換成C類型字符串指針。應(yīng)用接口的調(diào)用,或構(gòu)造另一個(gè)不同類型的字符串類,大多都要用到C類型指針。本文不涉及類的其它操作,如排序和比較等。

再?gòu)?qiáng)調(diào)一下,在完全了解轉(zhuǎn)換結(jié)果之前不要隨意使用強(qiáng)制類型轉(zhuǎn)換。

CRT類
_bstr_t

_bstr_t 是BSTR的完全包裝類。實(shí)際上,它隱含了BSTR。它提供多種構(gòu)造函數(shù),能夠處理隱含的C類型字符串。但它本身卻不提供BSTR的處理機(jī)制,所以不能作為COM方法的輸出參數(shù)[out]。如果要用到BSTR* 類型數(shù)據(jù),用ATL的CComBSTR類更為方便。

_bstr_t 數(shù)據(jù)可以傳遞給需要BSTR數(shù)據(jù)的函數(shù),但必須滿足以下三個(gè)條件:

首先,_bstr_t 具有能夠轉(zhuǎn)換為wchar_t*類型數(shù)據(jù)的函數(shù)。

其次,根據(jù)BSTR定義,使得wchar_t* 和BSTR對(duì)于編譯器來說是相同的。

第三,_bstr_t內(nèi)部保留的指向內(nèi)存數(shù)據(jù)塊的指針 wchar_t* 要遵循BSTR格式。

滿足這些條件,即使沒有相應(yīng)的BSTR轉(zhuǎn)換文檔,_bstr_t 也能正常工作。示例如下:

?// 構(gòu)造
_bstr_t bs1 = "char string";??????? // 從LPCSTR構(gòu)造
_bstr_t bs2 = L"wide char string"; // 從LPCWSTR構(gòu)造
_bstr_t bs3 = bs1;????????????? // 拷貝另一個(gè) _bstr_t
_variant_t v = "Bob";
_bstr_t bs4 = v;????????????? // 從一個(gè)含有字符串的 _variant_t 構(gòu)造
// 數(shù)據(jù)萃取
LPCSTR psz1 = bs1;????????????? // 自動(dòng)轉(zhuǎn)換到MBCS字符串
LPCSTR psz2 = (LPCSTR) bs1;???? // cast OK, 同上
LPCWSTR pwsz1 = bs1;??????????? // 返回內(nèi)部的Unicode字符串
LPCWSTR pwsz2 = (LPCWSTR) bs1;? // cast OK, 同上
BSTR??? bstr = bs1.copy();????? // 拷貝bs1, 返回BSTR
// ...
? SysFreeString ( bstr );

注意,_bstr_t 也可以轉(zhuǎn)換為char* 和 wchar_t*。這是個(gè)設(shè)計(jì)問題。雖然char* 和 wchar_t*不是常量指針,但不能用于修改字符串,因?yàn)榭赡軙?huì)打破內(nèi)部BSTR結(jié)構(gòu)。

[_variant_t]

_variant_t
_variant_t 是VARIANT的完全包裝類。它提供多種構(gòu)造函數(shù)和數(shù)據(jù)轉(zhuǎn)換函數(shù)。本文僅討論與字符串有關(guān)的操作。

// 構(gòu)造
_variant_t v1 = "char string"; // 從LPCSTR 構(gòu)造
_variant_t v2 = L"wide char string"; // 從LPCWSTR 構(gòu)造
_bstr_t bs1 = "Bob";
_variant_t v3 = bs1; // 拷貝一個(gè) _bstr_t 對(duì)象
// 數(shù)據(jù)萃取
_bstr_t bs2 = v1; // 從VARIANT中提取BSTR
_bstr_t bs3 = (_bstr_t) v1; // cast OK, 同上

注意,_variant_t 方法在轉(zhuǎn)換失敗時(shí)會(huì)拋出異常,所以要準(zhǔn)備用catch 捕捉_com_error異常。

另外要注意 _variant_t 不能直接轉(zhuǎn)換成MBCS字符串。要建立一個(gè)過渡的_bstr_t 變量,用其它提供轉(zhuǎn)換Unicode到MBCS的類函數(shù),或ATL轉(zhuǎn)換宏來轉(zhuǎn)換。

與_bstr_t 不同,_variant_t 數(shù)據(jù)可以作為參數(shù)直接傳送給COM方法。_variant_t 繼承了VARIANT類型,所以在需要使用VARIANT的地方使用_variant_t 是C++語言規(guī)則允許的。

在后面的章節(jié)里,我還會(huì)介紹STL、ATL等字符串類。

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的C++字符串完全指南(2) - 各种字符串类- CRT类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。