C++:强制类型转换
C中类型转换
1 2 3 4 5
| double x = 2.333; int y = (int)x; int z = int(x);
char* a=(char*)malloc(sizeof(char)*8);
|
旧式类型转换不明了,查找错误较为困难,C++中建议使用C++风格的类型转换
cast-name<type>(expression)
static_cast
任何具有明确定义的类型转换,只要不包含底层const都可以使用
1 2 3 4
| double slope = static_cat<double>(j)/i;
void* p=&d; double *dp=static_cast<double*> p;
|
const_cast
只能改变运算对象的底层const
1 2 3 4 5 6 7 8 9
| const char *pc; char *p=const_cast<char*>(pc);
char *q=static_cast<char*>(pc);
static_cast<string>(pc);
const_cast<string>(pc);
|
使用例子:
1 2 3 4 5 6 7 8 9 10
| const string &shorterString(const string&s1,const string &s2) { return s1.size()<=s2.size()?s1:s2; }
string &shorterString(string &s1,string &s2) { auto &r=shorterSting(const_cast<const string&>(s1),const_cast<const string&>(s2)); return const_cast<string&>(r); }
|
reinterpret_cast
通常为计算对象的位模式提供较低层次上的重新解释
1 2 3 4
| int *ip; char *pc=reinterpret_cast<char*>(ip);
string str(pc);
|
reinterpret_cast依赖于机器,应谨慎使用
dynamic_cast
用于将基类指针或者引用安全地转换成派生类指针或引用
指针类型的dynamic_cast
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| classs Base{ public: vitual sleep(); }
class Derived:public Base{ public: sleep(); }
Base* bp; if(Derived *dp=dynamic_cast<Derived>(bp)) { }else{ }
|
在条件部分执行dynamic_cast操作可以确保类型转换和结果检查在同一条表达式中完成。
引用类型的dynamic_cast
1 2 3 4 5 6 7 8 9 10
| #include<typeinfo>
void f(const Base &b) { try{ const Derived &d=dynamic_cast<const Derived&> (b); }catch(bad_cast){ } }
|
说明
未定义错误并不一定报错,只是不同编译器可能结果不同,代码中应该避免出现,或者在理解底层原理的情况下谨慎使用
参考资料