类型转换操作
a = dynamic_cast<T*>(p)
Try to convert p into a T*. It may return 0
a = dynamic_cast<T&>(*p)
Try to convert *p into a T&. It maythrow bad_cast
a = static_cast<T>(p)
Convert p into a T if a T can be contertedinto p's type.
a = reinterpret_cast<T>(p)
Convert p into a T represented by the samebit pattern.
a =const_cast<T>(p)
Convert p into a T by adding or subtractingconst.
a = (T)v
C-style cast.
a = T(v)
Functional cast.
const_cast
const_cast 用来去掉对象的const 限制,c++中只有此操作符可以完成这个功能。
其语法格式为:
const_cast < type-name > (expression)
示例代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int main () {
string str("A123456789");
const char *cstr = str.c_str();
char *nonconst_cstr = const_cast<char *> (cstr) ;
*nonconst_cstr ='B';
cout << nonconst_cstr << endl;
return 0;
}
reinterpret_cast
reinterpret_cast 是一种比较低级的转换,这种转帐非常不可靠,个人建议少用。
其语法格式为:
reinterpret_cast < type-name > (expression)
示例代码:
#include <iostream>
using namespace std;
struct data {
short a;
short b;
};
int main () {
long value = 0xA2345678;
data* pdata = reinterpret_cast<data*> (&value);
cout << pdata->a << endl;
return 0;
}
static_cast
static_cast 用来强制的内存转换,如:non-const 对象到 const 对象,int 到double.此操作可以完成除const 到 non-const的所有转换。
语法格式:
static_cast < type-name > (expression)
示例代码:
class Base {};
class Derived : public Base {};
class UnrelatedClass {};
int main()
{
Base base;
Derived derived;
// #1: valid upcast
Base *pBase = static_cast<Base *>(&derived);
// #2: valid downcast
Derived *pDerived = static_cast<Derived *> (&base);
// #3: invalid, between unrelated classes
UnrelatedClass *pUnrelated
= static_cast<UnrelatedClass *> (&derived);
}
通过此示例代码可以得知:static_cast 可以在继承类间向上转换,向下转换但不能在不相关类之间做转换。
dynamic_cast
dynamic_cast 是用来在类的继承关系中安全的向下转换。
示例代码见上一个博文。