reinterpret_cast{\red{reinterpret\_cast}}reinterpret_cast
对二进制数据进行重新解释
char *a = new char;
*a = 'a';
cout<<*a<<endl;
printf("%0x\n",a);
int *b = reinterpret_cast<int*>(a);
cout<<*b<<endl;
printf("%0x\n",b);
输出:{\orange{输出:}}输出: a 地址 97 地址
两个地址相同,只是对二进制数据进行新的解释{\green{两个地址相同,只是对二进制数据进行新的解释}}两个地址相同,只是对二进制数据进行新的解释
因为类型长度不一样,很危险{\green{因为类型长度不一样,很危险}}因为类型长度不一样,很危险
const_cast{\red{const\_cast}}const_cast
解除const,必须为指针或引用
struct A{
int v;
A():v(0){}
};
int main(){
// struct
const A a;
A* p1 = const_cast<A*>(&a); // 指针
p1->v = 1;
cout<<a.v<<endl;
A& p2 = const_cast<A&>(a); // 引用
p2.v = 2;
cout<<a.v<<endl;
const int b = 0;
// int
int* q1 = const_cast<int*>(&b); // 指针
*q1 = 1;
cout<<b<<endl;
int& q2 = const_cast<int&>(b); // 引用
q2 = 2;
cout<<b<<endl;
return 0;
}
输出:1 2 0 0{\orange{输出:1\ 2\ 0\ 0}}输出:1 2 0 0
结构体可以,整型不可以{\green{结构体可以,整型不可以}}结构体可以,整型不可以
dynamic_cast{\red{dynamic\_cast}}dynamic_cast 和 static_cast{\red{static\_cast}}static_cast
dynamic_cast:向下安全转型,继承链必须有虚函数,RTTI通过虚表实现
static_cast:数据类型转型,最常见的类型转换,有可能不安全。
主要用于继承体系,由指向派生类的基类指针{\red{指向派生类的基类指针}}指向派生类的基类指针转为派生类指针{\red{派生类指针}}派生类指针或兄弟类指针{\red{兄弟类指针}}兄弟类指针
class A1{
public:
virtual void printA1(int x=1){cout<<"A1 "<<x<<endl;}
};
class A2{
public:
virtual void printA2(int x=2){cout<<"A2 "<<x<<endl;}
};
class B:public A1,public A2{
public:
virtual void printA1(int x=10){cout<<"B:A1 "<<x<<endl;}
virtual void printA2(int x=20){cout<<"B:A2 "<<x<<endl;}
};
int main(){
A1 *a1 = new B;
//p->printA2(); //error
B *b = dynamic_cast<B*>(a1); // 派生类
b->printA2();
A2 *a2 = dynamic_cast<A2*>(a1); // 兄弟类
a2->printA2();
B *bs = static_cast<B*>(a1);
// A2 *a2d = static_cast<A2*>(a1); //error
return 0;
}
输出:{\orange{输出:}}输出: B:A2 20 B:A2 2
dynamic_cast可以将基类指针转为派生类,转为基类的兄弟类。{\green{dynamic\_cast可以将基类指针转为派生类,转为基类的兄弟类。}}dynamic_cast可以将基类指针转为派生类,转为基类的兄弟类。
static_cast可以将基类指针转为派生类{\green{static\_cast可以将基类指针转为派生类}}static_cast可以将基类指针转为派生类