文章目录
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