数据类型转换
目录
一、C++强制类型转换
二、字符串之间的转换
三、数字类型与字符串之间的转换
四、十六进制数据与字符串转换
一、C++强制类型转换
C++提供了四种强制类型转换:
强制转换类型 | 功能 | 备注 |
static_cast
|
非多态类型的转换,不能用于两个不相关类型的转换,比如不能用于整型和整型指针之间转换 |
1.基本类型之间的转换 |
reinterpret_cast | 把一种类型转换成另一种不相关的类型,比如整型与整型指针的转换 | |
const_cast | 删除变量的const属性,方便再次赋值 | 被定义为const的变量,编译器会对其优化,在寄存器中存取,默认不能改变 |
dynamic_cast | 父类对象的指针转换成子类对象的指针或引用 |
1.只能用于含有虚函数的类 |
具体使用如下:
void test_static_cast() { int i = 0; double j = i;//C的隐式转换 cout << j <<endl; double m = static_cast<double>(i);//C++的强制类型转换 cout << m <<endl; }
void test_reinterpret_cast()
{
int i = 2;
int* q = &i;
cout << "q = " << q << endl;//输出地址
cout << "*q = " << *q << endl;//输出2
int* p = reinterpret_cast<int*>(i);
cout << "p=" << p << endl;//输出0000000000000002
cout << "*p = " << *p << endl;//输出空,因为没有对该地址进行操作
}
void test_const_cast() { const int i = 10; int* j = const_cast<int*>(&i); *j=20; cout << "i=" << i << endl;//输出10 cout << "*j=" << *j << endl;//输出20 }
//子类转换成父类,直接=即可,称为向上转型
//父类转换成子类,需要使用dynamic_cast进行安全转换,称为向下转型
class B:public A
{
public:
virtual void f()
{
cout << "B:f()" << endl;
}
int b;
};
void Fun(A* p)
{
//B* pb = (B*)p;//类A传入时,输出的pb->a是随机数
B* pb = dynamic_cast<B*>(p);//类A传入时,转换失败
if(pb)
{
cout << "convert class B" << endl;
pb->f();
cout << pb->a << endl;
cout << pb->b << endl;
}
else
{
cout << "can't convert class B" << endl;
}
}
void test_dynamic_cast()
{
A a;
a.a = 1;
B b;
b.a = 2;
b.b = 3;
Fun(&a);
Fun(&b);
}
二、字符串转换
常用到的字符串有CString,std::string,char* ,const char*,TCHAR等,它们之间的转换如下:
2.1 .string/char*/const char* ----> CString
使用CString::Format()实现,其它类型,int/double/float等都是用此函数转换成CString。
2.2 CString -->> string
//第一种方式: CString str; USES_CONVERSION; std::string s(W2A(str));//仅unicode字符集下使用 //第二种方式: CString str ; std::string s = (CT2A)str;
2.3 CString -->> conat char*
//第一种方式 CString str; const char* chstr; char temp[MAX_PATH]; ::wsprintfA(temp, "%ls",(LPCTSTR)str);//unicode字符集下不可用 cHstr = temp; //第二种方式 CString str; USES_CONVERSION; std::string s(W2A(str));//仅Unicode字符集下使用 const char* cstr = s.c_str(); //第三种方式 CString str; char* ch = CT2A(str);
2.4 string -->> const char*
string str; char* ch = str.data(); //或者 char* ch = str.c_str();
2.5 char* -->> string
char* ch; string str = ch;
2.6 TCHAR--->CString
_tcscpy();
三、数字类型与字符串之间的转换
数字类型 ---> 字符串char* : itoa gcvt等等函数
数字类型 ---> 字符串string :使用std::to_string()
字符串char* ---> 数字类型 :atoi atol atof strtod strtol strtoul wcstol wcstoul等等函数
字符串string -- -> 数字类型 : 使用C标准库函数:atoi strtoul等;或者使用C++标准库函数(c++11) stoi stol stoul stoll stof stod等