C++数据类型转换技巧

来源:互联网 发布:大头贴软件 编辑:程序博客网 时间:2024/05/17 05:08
http://wenku.baidu.com/link?url=PRGkGxEo6bjaVTIlnzx34Eg5ym1jXTP4Cptz9vyJsaeuL3JhDZ85HxLKwGq6fbTwASnFIOxsF7LGPHBl8ny4Dbjdc8ugdjefj0mfS2A8U83


































































































需要说明的是, strcpy(或可移植的_tcscpy)的第二参数是const wcahr_t*(Unicode) 或const char*(ANSI),系统编译器将会自动对其进行转换。 
(3)使用GetBuffer 
如果需要修改CString中的内容,它有一个特殊的方法可以使用,哪就是GetBuffer, 它的作用是返回一个可写的缓冲指针。如果只是打算修改字符或者截短字符串, 例如: 
CString s(_T("Char test ")); LPTSTR p = s.GetBuffer(); // 添加P的代码 
s.ReleaseBuffer() // 使用完后及时释放。 
10.CString与BSTR的相互转换 
(1)CString 转换为 BSTR 
调用CString 对象的AllocSysString 方法将CString转化成BSTR,如: CString str = "this is a test "; BSTR b = str.AllosysString(); 
str.FreeSystring(); // 最后不要忘记了释放 
(2)BSTR转换为CString 
CString convert(BSTR b) { 
CString s; if(b == NULL) return s; #ifdef UNICODE s = b; 


















#else 
LPSTR p = s.GetBuffer(SYsStringLen(b) + 1); 
::WidecharToMultiByte(CP_ACP,0,b,-1,p,SysStringLen(b)+1,NULL,NULL); s.ReleaseBuffer(); #endif return s; } 
11. BSTR、_bstr_t 与 CComBSTR的关系 
CComBSTR是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不是直接指向字符串的缓冲区。 
(1)char *转换到BSTR 
BSTR b = _com_util::ConvertStringToBSTR("数据"); SysFreeString(bstrValue); 
(2)BSTR转换到char* 
char *p=_com_util::ConvertBSTRToString(b); delete p; 
12.typedef和typename关键字 
这两个关键字在运用的时候时常会令人迷惑,其实很简单,typedef是类型定义,而typename是类型解释。 
(1)typedef关键字 
类型说明给已经存在的数据类型起一个别名,定义名字表示这个类型的新名字。类型说明的格式为typedef 类型 定义名; 例如,用下面语句定义整型数的新名字: 
typedef int INT_COUNT; // 可读性更强(计数器类型为整型) 


















INT_COUNT intcount; intCount = 123; 
cout << intCount << endl; 
typedef同样可用来说明结构、联合以及枚举和类。 如: typedef struct book{ float fprice; char* szAuthor[20]; int nPage;} *BOOK; viod fun() { 
BOOK mybook = new book; myBook -> fPrice = 40.80; myBook -> szAuthor = "jf"; myBook -> npage = 200; } 
(2)typename 关键字 
typename和class用在模版定义开始部分时,它们的意义相同,但tpyename是用来 告诉编译器模版中有一个表示类型名。 Template<clsaa T>calss fun{ Void bar(){ T::Bletch * p; .... .... } } 


















在上述代码中,T::Bletch * p是指什么,这一点就很让人迷惑。但如果写成这样就不会 出现这个问题: 
Template<class T> class fun { 
Void bar() { 
Typename T::Bletch * p; } } 
在模版定义里,也可以用<typename T>代替<class T>,即 template<class T>与templare<typename T>具有相同意义。 
13.VARIANT的处理技巧 
(1)VARIANT的定义 
VARIANT被称为变体类型,其定义可以参考头文件VC98\INCLUDE\OAIDL.H 关于结构体 tagVARIANT定义。 
(2)引入VARIANT的原因 
目前计算机语言多种多样,如C++、java、Basic、Pascal等,它们各自又都有自己的 数据类型,VARIANT数据类型就具有跨语言的特性,同时它可以表示(储存)任意类型 的数据。从C语言的角度来讲,VARIANT其实是一个结构,结构中用一个域(vt)表示,同时 正真的数据则存储在union空间中。 
(3)VARIANT的应用 
利用VARIANT表示可一个整型数据: VARIANT va; int a=2001; 


















va.vt = VT_I4; // 指明整型数据 va.lVal=a; // 赋值 
利用VARIANT表示一个布尔值: VARIANT va; 
vb.vt = VT_BOOL; // 指明整型数据 va.boolVal = VARIANT_TRUE; // 赋值 利用VARIANT保存一个字符串: VARIANT va; va.vt = VT_BSTR; 
va.bstrVal = SysAllocString(L"Hello,this is a test "); 
从上面可以看出这种类型使用起来比较复杂,其实有简单的方法,采用VARIANT的封装类_variant_t, 其赋值 
可以使用强制类型转换,其构造函数会自动处理这些数据类型。 代码参考如下: long l=222; ing i=100; 
_varint_t lVal(l); lVal = (long)i; 
也可以用ColeVariant来简化对VARIANT的操作,代码参考如下: COleVariant v3 = "this is a test", v4 = (long)1999; CString str = (BSTR)v3.pbstrVal; long i = v4.lVal




























































































需要说明的是, strcpy(或可移植的_tcscpy)的第二参数是const wcahr_t*(Unicode) 或const char*(ANSI),系统编译器将会自动对其进行转换。 
(3)使用GetBuffer 
如果需要修改CString中的内容,它有一个特殊的方法可以使用,哪就是GetBuffer, 它的作用是返回一个可写的缓冲指针。如果只是打算修改字符或者截短字符串, 例如: 
CString s(_T("Char test ")); LPTSTR p = s.GetBuffer(); // 添加P的代码 
s.ReleaseBuffer() // 使用完后及时释放。 
10.CString与BSTR的相互转换 
(1)CString 转换为 BSTR 
调用CString 对象的AllocSysString 方法将CString转化成BSTR,如: CString str = "this is a test "; BSTR b = str.AllosysString(); 
str.FreeSystring(); // 最后不要忘记了释放 
(2)BSTR转换为CString 
CString convert(BSTR b) { 
CString s; if(b == NULL) return s; #ifdef UNICODE s = b; 


















#else 
LPSTR p = s.GetBuffer(SYsStringLen(b) + 1); 
::WidecharToMultiByte(CP_ACP,0,b,-1,p,SysStringLen(b)+1,NULL,NULL); s.ReleaseBuffer(); #endif return s; } 
11. BSTR、_bstr_t 与 CComBSTR的关系 
CComBSTR是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不是直接指向字符串的缓冲区。 
(1)char *转换到BSTR 
BSTR b = _com_util::ConvertStringToBSTR("数据"); SysFreeString(bstrValue); 
(2)BSTR转换到char* 
char *p=_com_util::ConvertBSTRToString(b); delete p; 
12.typedef和typename关键字 
这两个关键字在运用的时候时常会令人迷惑,其实很简单,typedef是类型定义,而typename是类型解释。 
(1)typedef关键字 
类型说明给已经存在的数据类型起一个别名,定义名字表示这个类型的新名字。类型说明的格式为typedef 类型 定义名; 例如,用下面语句定义整型数的新名字: 
typedef int INT_COUNT; // 可读性更强(计数器类型为整型) 


















INT_COUNT intcount; intCount = 123; 
cout << intCount << endl; 
typedef同样可用来说明结构、联合以及枚举和类。 如: typedef struct book{ float fprice; char* szAuthor[20]; int nPage;} *BOOK; viod fun() { 
BOOK mybook = new book; myBook -> fPrice = 40.80; myBook -> szAuthor = "jf"; myBook -> npage = 200; } 
(2)typename 关键字 
typename和class用在模版定义开始部分时,它们的意义相同,但tpyename是用来 告诉编译器模版中有一个表示类型名。 Template<clsaa T>calss fun{ Void bar(){ T::Bletch * p; .... .... } } 


















在上述代码中,T::Bletch * p是指什么,这一点就很让人迷惑。但如果写成这样就不会 出现这个问题: 
Template<class T> class fun { 
Void bar() { 
Typename T::Bletch * p; } } 
在模版定义里,也可以用<typename T>代替<class T>,即 template<class T>与templare<typename T>具有相同意义。 
13.VARIANT的处理技巧 
(1)VARIANT的定义 
VARIANT被称为变体类型,其定义可以参考头文件VC98\INCLUDE\OAIDL.H 关于结构体 tagVARIANT定义。 
(2)引入VARIANT的原因 
目前计算机语言多种多样,如C++、java、Basic、Pascal等,它们各自又都有自己的 数据类型,VARIANT数据类型就具有跨语言的特性,同时它可以表示(储存)任意类型 的数据。从C语言的角度来讲,VARIANT其实是一个结构,结构中用一个域(vt)表示,同时 正真的数据则存储在union空间中。 
(3)VARIANT的应用 
利用VARIANT表示可一个整型数据: VARIANT va; int a=2001; 


















va.vt = VT_I4; // 指明整型数据 va.lVal=a; // 赋值 
利用VARIANT表示一个布尔值: VARIANT va; 
vb.vt = VT_BOOL; // 指明整型数据 va.boolVal = VARIANT_TRUE; // 赋值 利用VARIANT保存一个字符串: VARIANT va; va.vt = VT_BSTR; 
va.bstrVal = SysAllocString(L"Hello,this is a test "); 
从上面可以看出这种类型使用起来比较复杂,其实有简单的方法,采用VARIANT的封装类_variant_t, 其赋值 
可以使用强制类型转换,其构造函数会自动处理这些数据类型。 代码参考如下: long l=222; ing i=100; 
_varint_t lVal(l); lVal = (long)i; 
也可以用ColeVariant来简化对VARIANT的操作,代码参考如下: COleVariant v3 = "this is a test", v4 = (long)1999; CString str = (BSTR)v3.pbstrVal; long i = v4.lVal
0 0