c++类型转换

 

该篇文章分两个部分:

1、数据类型说明

2、数据类型转换代码实现

 

一、数据类型说明:

int:c/c++中的整数型,该类型变量在32位编译器中占4个字节即32位

char:c/c++中的字符型,该类型变量在32位编译器中占1个字节即8位

wchar_t:c/c++中宽字符型,该类型变量在32位编译器中占2个字节即16位

c/c++中的指针类型:指针类型变量在32位编译器中占4个字节即32位,类似于int型,指针变量中存放的是一块内存的地址 

string、wstring:均为标准c++库中类包含在头文件<string>中,类的内部实际上是维护一个char*指针变量

CString:MFC封装的字符串类包含在头文件<afx.h>或者<afxwin.h>中,类的内部也是维护一个char*指针变量

还有一类类型名全部大写的如:TCHAR、LPSTR...这一类数据类型属于微软定义的宏,一般多用于WindowsAPI中参数类型或者返回值类型下图是一个对应表:

类型 在ANSI环境下 在UniCode环境下
WCHAR wchar_t wchar_t
LPSTR char* char*
LPCSTR const char* const char*
LPWSTR wchar_t* wchar_t*
LPCWSTR const wchar_t* const wchar_t*
TCHAR char wchar_t
LPTSTR char* wchar_t*
LPCTSTR const char* const wchar_t*

 二、实现代码

 1 #pragma once
 2 
 3 /************************************************************************/
 4 /* win7 32位操作系统  vs2010旗舰版
 5     Win32控制台程序 项目属性中将MFC使用设为在共享DLL中使用MFC
 6 */
 7 /************************************************************************/
 8 
 9 
10 #include<afxwin.h>  //使用CString类时要包含该头文件
11 #include <string>     //使用string类 wstring类时要包含该同文件
12 
13 class TypeConver
14 {
15 public:
16     TypeConver(void);
17     ~TypeConver(void);
18     
19 public:
20     void Release();
21 
22     wchar_t* CToWC(const char* pch);                          //char*->wchar_t*
23     char* WCToC(const wchar_t* pwch);                        //wchar_t*->char*
24     //char*->string wchar_t*->wstring可以直接赋值 
25     char* StrToC(const std::string& str );                        //string->char*
26     char* WStrToC(const std::wstring& wstr);                 //wstring->char*
27     wchar_t* StrToWC(const std::string& str);                 //string->wchar_t*
28     wchar_t* WStrToWC(const std::wstring& wstr);         //wstring->wchar_t*
29     std::wstring StrToWStr(const std::string& str);           //string->wstring
30     std::string WStrToStr(const std::wstring& wstr);        //wstring->string
31     
32     CString CToCStr(const char* pch);                           //char*->CString
33     CString StrToCStr(const std::string& str);                 //string->CString
34     TCHAR* CStrToTC( CString& cstr);                            //CString->TCHAR
35     
36     char*  IntToC(const int& n);                                    //int->char*
37     int CToInt(const char* pch);                                     //char*->int
38     CString IntToCStr(const int& n);                              //int->CString
39     int CStrToInt(const CString& cstr);                          //CString->int
40 
41 private:
42     char* m_char;
43     wchar_t* m_wchar;
44 
45 };
.h文件

 

  1 #include "StdAfx.h"
  2 #include "TypeConver.h"
  3 
  4 
  5 TypeConver::TypeConver(void):m_char(NULL),m_wchar(NULL)//初始化列表给私有成员变量赋值
  6 {
  7 }
  8 
  9 TypeConver::~TypeConver(void)
 10 {
 11     //在析构函数中释放分配的内存
 12     Release();
 13 }
 14 
 15 void TypeConver::Release()
 16 {
 17     if(m_char){
 18         delete[] m_char;
 19         m_char=NULL;
 20     }
 21     if(m_wchar){
 22         delete[] m_wchar;
 23         m_wchar=NULL;
 24     }
 25 }
 26 
 27 wchar_t* TypeConver::CToWC(const char* pch)
 28 {
 29     Release();
 30     //第一次调用该函数获得要转化字符串长度(不包含字符串最后的'\0'结束标志)
 31     int len=MultiByteToWideChar(CP_ACP,0,pch,strlen(pch),NULL,0);
 32     m_wchar=new wchar_t[len+1];  //动态分配内存 
 33 
 34     /*本来想用下面这条语句为上面分配的内存赋初值的但是出现中断 
 35     猜测原因:wchar_t占据2字节,与memset赋值单元不匹配
 36     memset(pch,'0',(len+1)*sizeof(wchar_t)); */
 37 
 38     
 39     /*有很多API都会有这种用法:
 40     第一次调用某个API获得一个参数,第二次调用同样的API将第一次获得的参数传进去得到最终想要的结果
 41     */
 42     //第二次调用该函数将pch所指的字符串复制到上面分配的内存空间上,该空间首地址为m_wchar的
 43     MultiByteToWideChar(CP_ACP,0,pch,strlen(pch),m_wchar,(len+1)*sizeof(wchar_t));
 44     m_wchar[len]='\0';//将m_wchar指向的字符串最后一个字符设为字符串结束标识符
 45     return m_wchar;
 46 }
 47 
 48 char* TypeConver::WCToC(const wchar_t* pwch)
 49 {
 50     Release();
 51     int len=WideCharToMultiByte(CP_ACP,0,pwch,wcslen(pwch),NULL,0,NULL,NULL);
 52     m_char=new char[len+1];
 53     //memset():作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。
 54     //字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以没有问题
 55     memset(m_char,0,(len+1)*sizeof(char));
 56     WideCharToMultiByte(CP_ACP,0,pwch,wcslen(pwch),m_char,(len+1)*sizeof(char),NULL,NULL);
 57     m_char[len]='\0';
 58     return m_char;
 59 }
 60 
 61 char* TypeConver::StrToC(const std::string& str )
 62 {
 63     //return str.c_str();//报错:无法从"const char *"转换为"char *"
 64     /*const_cast<>()  作用:
 65     1、常量指针被转化成非常量的指针,并且仍然指向原来的对象;
 66     2、常量引用被转换成非常量的引用,并且仍然指向原来的对象;*/
 67     return const_cast<char*>(str.c_str());
 68 }
 69 
 70 char* TypeConver::WStrToC(const std::wstring& wstr)
 71 {
 72     const wchar_t* pwch=wstr.c_str();
 73     return WCToC(pwch);
 74 }
 75 
 76 wchar_t* TypeConver::StrToWC(const std::string& str)
 77 {
 78     const char* pch=str.c_str();
 79     return CToWC(pch);
 80 }
 81 
 82 wchar_t* TypeConver::WStrToWC(const std::wstring& wstr)
 83 {
 84     return const_cast<wchar_t*>(wstr.c_str());
 85 }
 86 
 87 std::wstring TypeConver::StrToWStr(const std::string& str)
 88 {
 89     std::wstring wstr;
 90     wchar_t* pwch=StrToWC(str);
 91     wstr.append(pwch);
 92     return wstr;
 93 }
 94 
 95 std::string TypeConver::WStrToStr(const std::wstring& wstr)
 96 {
 97     std::string str;
 98     char* pch=WStrToC(wstr);
 99     str.append(pch);
100     return str;
101 }
102 
103 CString TypeConver::CToCStr(const char* pch)
104 {
105     return CString(pch);
106 }
107 
108 CString TypeConver::StrToCStr(const std::string& str)
109 {
110     return CString(str.c_str());
111 }
112 
113 TCHAR* TypeConver::CStrToTC(CString& cstr)
114 {
115     TCHAR* pch=cstr.GetBuffer(cstr.GetLength());
116     return pch;
117 }
118 
119 char*  TypeConver::IntToC(const int& n)
120 {
121     Release();
122     /*int占4个字节,n最大值为2^31-1 是一个10位数 所以这里开辟一个包含11个字节的内存空间,
123     个人想法如果有错或者更好的方法欢迎交流*/
124     m_char=new char[11];
125     _itoa_s(n,m_char,11,10);
126     return m_char;
127 }
128 
129 int TypeConver::CToInt(const char* pch)
130 {
131     return atoi(pch);
132 }
133 
134 CString TypeConver::IntToCStr(const int& n)
135 {
136     CString cstr;
137     cstr.Format(_T("%d"),n);
138     return cstr;
139 }
140 
141 int TypeConver::CStrToInt(const CString& cstr)
142 {
143     return _ttoi(cstr);
144 }
.cpp文件

 

声明:

(1)每篇文章中内容均为个人看法或见解,不能保证绝对正确,如果有错误或有更好的改进方案欢迎指出

(2)每篇文章最后都会附上该篇文章所参考的资料,如有侵权请参考资料的作者及时与我(persistzpf@163.com)联系,我会及时删除侵权内容

 

【参考资料 感谢作者】

http://www.cnblogs.com/Dageking/p/3520570.html

http://www.cnblogs.com/ziwuge/archive/2011/06/19/2084608.html

posted @ 2014-11-18 18:21  persistfly  阅读(180)  评论(0)    收藏  举报