const_cast
const_cast最常用的用途就是删除变量的const属性,方便赋值。
void TestConst()
{
const int a = 2;
//volatile const int a = 2; (不去寄存器上取,去栈上取数据)
int* p = const_cast< int*>(&a);
*p = 3;
cout << a << endl;//2 why?
cout << *p << endl;//3
}
dynamic_cast
dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引用(动态转换)
向上转型:子类对象指针->父类指针/引用(不需要转换)
向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的)
1. dynamic_cast只能用于含有虚函数的类
2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
class A
{
public:
virtual void f(){}
};
class B : public A
{};
void TestDynamic()
{
A a;
B b;
// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
B* pb = dynamic_cast<B*>(&a); //父类->子类
A* pa = dynamic_cast<A*>(&b); //子类->父类
cout << "pa:" << pa << endl;
cout << "pb:" << pb << endl;
}
为什么向下的类型转换是危险的?
这里写代码片
static_cast
reinterpret_cast
reinterpret_cast操作符用于将一种类型转换为另一种不同的类型。
typedef void(*FUNC)();
int DoSomething(int i)
{
cout << "DoSomething" << endl;
return 0;
}
void TestReinterpret()
{ // reinterpret_cast可以编译器以FUNC的定义方式去看待 DoSomething函 数
// 所以非常的BUG,下面转换函数指针的代码是不可移植的,所以不建议这 样用
// C++不保证所有的函数指针都被一样的使用,所以这样用有时会产生不确定的结果
FUNC f = reinterpret_cast<FUNC>(DoSomething );
f();
}