文章目录
C的类型转换
隐式类型转换:在编译的时候自动就进行,不需要我们手动操作(相近类型,意义相似类型就可以)
强制类型转换:需要我们自己处理
1 2 3 4 5 6 7
| void demo1() { int i=10; double d=i; int* p=&i; int address=(int)p; }
|
C++的类型转换
C++兼容C语言,所以C++也是强类型的语言
C++语言为了加强类型转换的可视性,引入了4种命名的强制类型转换操作符
static_cast
static_cast:用于两个类型之间意义相近的,不能用在两个不相关类型之间的转换
1 2 3 4 5 6 7 8 9 10 11
| void demo2() {
double d=1.22; int a=static_cast<int> (d); cout<<a<<endl;
}
|
reinterpreter_cast
reinterpret_cast:用于两个不相关类型之间的转换,但是不能用在两个类型相近之间
1 2 3 4 5 6 7 8 9
| void demo3() { int a=10; int* p=reinterpret_cast<int*> (a); double d=2.2; }
|
const_cast
const_cast就是把原来一个const属性的变量去除了const属性,方便赋值
1 2 3 4 5 6 7 8 9 10
| void demo4() {
volatile const int a=10; int* p=const_cast<int*> (&a); *p=2; cout<<a<<endl; cout<<*p<<endl; }
|
dynamic_cast
dynamic_cast :主要用于向下转换:父类对象指针/引用———>>子类指针/引用(dynamic_cast是安全的)
- 使用的时候,父类对象必须包含虚函数
- 失败的时候返回nullptr,说明原来对象为父类对象
- 成功,就能讲父类对象转换成子类对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| class A { public: virtual void f(); protected: int x; };
class B:public A { public: int m; };
void func(A* pa) {
B* pb2=dynamic_cast<B*> (pa); if(pb2==nullptr) { cout<<"转换失败"<<endl; } else { cout<<"转换成功"<<endl; pb2->m=10;
} } void demo5() { A a; B b; a=b; func(&a); func(&b); }
|
总结
- 去const属性用const_cast
- 基本类型转换用static_cast
- 多态类之间的类型转换用dynamic_cast
- 不同类型的指针类型转换用reinterpret_cast