C++ 类型转换

简介: C++ 类型转换

1、类型转换介绍

C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:


TYPE b = (TYPE)a  


C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。


  1、 static_cast<>()  静态类型转换,编译的时c++编译器会做类型检查;


基本类型能转换 但是不能转换指针类型


2、reinterpreter_cast         重新解释类型,若不同类型之间进行强制类型转换,则用reinterpret_cast<>() 进行重新解释。


注:C语言中  能隐式类型转换的,在c++中可用 static_cast<>()进行类型转换。因C++编译器在编译检查一般都能通过;


C语言中不能隐式类型转换的,在c++中可以用 reinterpret_cast<>() 进行强行类型 解释。总结:static_cast<>()和reinterpret_cast<>() 基本上把C语言中的 强制类型转换给覆盖。reinterpret_cast<>()很难保证移植性。


3、dynamic_cast                  命名上理解是动态类型转换。如子类和父类之间的多态类型转


4、const_cast,          字面上理解就是去const属性。


4种类型转换的格式:


        TYPE B = static_cast<TYPE> (a)


2、使用举例

1、实现static_cast类型转换、c语言的就是类型转换和隐式转化。

#include <iostream>


using namespace std;


void main()


{


   double dPi = 3.1415926;



   //1静态的类型转换:  在编译的时 进行基本类型的转换 能替代c风格的类型转换 可以进行一部分检查


   int num1 = static_cast<int> (dPi); //c++的新式的类型转换运算符


   int num2 = (int)dPi;                //c语言的 旧式类型转换


   int num3 = dPi;                     //隐士类型转换


   cout << "num1:" << num1 << " num2:" << num2 << " num3:" << num3 << endl;


   return;


}

tt.png

2、实现char * 向int * 的转换。

char* 向int* 转换时,由于不是基本类型所以不能使用static_cast,这时候就需要使用reinterpret_cast,例:


#include <iostream>


using namespace std;



void main()


{


   char p[10]= "hello";


   char *p1 = p;


   int *p2 = NULL;


   p2 = (int *)p1;


   //2 基本类型能转换 但是不能转换指针类型


   //p2 = static_cast<int *> (p1); //“static_cast”: 无法从“char *”转换为“int *”


   //3 可以使用  reinterpret_cast 进行重新解释


   p2 = reinterpret_cast<int *> (p1);


   cout << "p1 " << p1 << endl;


   cout << "p2 " << p2 << endl;


   //4 一般性的结论:  c语言中  能隐式类型转换的 在c++中可以用 static_cast<>()进行类型转换  //C++编译器在编译检查一般都能通过


   //c语言中不能隐式类型转换的,在c++中可以用 reinterpret_cast<>() 进行强行类型 解释


   return;


}


运行结果:

tt.png

3、使用dynamic_cast实现父类和子类之间的转换

#include <iostream>


using namespace std;


class Tree {};


class Animal


{


public:


   virtual void cry() = 0;


};


class Dog : public Animal


{


public:


   virtual void cry()


   {


       cout << "汪汪" << endl;


   }


   void doHome()


   {


       cout << "看家" << endl;


   }


};


class Cat : public Animal


{


public:


   virtual void cry()


   {


       cout << "喵喵" << endl;


   }


   void doThing()


   {


       cout << "抓老鼠" << endl;


   }


};


void playObj(Animal *base)


{


   base->cry(); // 1有继承 2虚函数重写 3 父类指针 指向子类对象  ==>多态


   //能识别子类对象


   // dynamic_cast 运行时类型识别  RIIT


   Dog *pDog = dynamic_cast<Dog *>(base);


   if (pDog != NULL)


   {


       pDog->doHome(); //让够 做自己 特有的工作


   }


   Cat *pCat = dynamic_cast<Cat *>(base);  //父类对象 ===> 子类对象


                                           //向下转型


                                           //把老子 转成 小子


   if (pCat != NULL)


   {


       pCat->doThing();  //让够 做自己 特有的工作


   }


}



void main()


{


   Dog d1;


   Cat c1;


   Animal *pBase = NULL;


   pBase = &d1;


   playObj(&d1);


   playObj(&c1);


   return;


}

tt.png

4、const_cast的典型用法:将形参的只读属性去掉。

#include <iostream>


using namespace std;



//典型用法 把形参的只读属性去掉


void Opbuf(const char *p)


{


   cout << p << endl;


   char *p2 = const_cast<char*>(p);


   p2[0] = 'b';


   cout << p << endl;


}



void main()


{


   const char *p1 = "11111111111";


   char *p3 = const_cast<char *>(p1);


   const char buf[100] = "aaaaaaaaaaaa";


   Opbuf(buf);


   //要保证指针所执行的内存空间能修改才行 若不能修改 还是会引起程序异常


   //Opbuf("dddddddddddsssssssssssssss");


   return;


tt.png

目录
相关文章
|
1月前
|
安全 编译器 程序员
【C++】C++的类型转换
【C++】C++的类型转换
|
1月前
|
安全 编译器 程序员
特殊类设计以及C++中的类型转换
特殊类设计以及C++中的类型转换
34 2
|
1月前
|
设计模式 安全 算法
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
73 0
|
1月前
|
安全 编译器 C++
【C/C++ 类型转换规则】一文了解C/C++ 中的类型转换规则,帮助你更好的编程
【C/C++ 类型转换规则】一文了解C/C++ 中的类型转换规则,帮助你更好的编程
32 0
|
1月前
|
存储 安全 编译器
C++:现代类型转换
C++:现代类型转换
30 5
|
27天前
|
安全 程序员 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(下)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
23 5
|
1月前
|
存储 安全 程序员
C++中的四种类型转换运算符
reinterpret_cast` 则是非常危险的类型转换,仅用于二进制级别的解释,不检查安全性。`dynamic_cast` 用于类的继承层次间转换,向上转型总是安全的,向下转型时会借助 RTTI 进行安全性检查。只有当转换路径在继承链内时,转换才会成功。
13 1
|
1月前
|
编译器 C++
【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)
【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)
13 2
|
27天前
|
设计模式 编译器 Linux
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(中)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
21 0
|
27天前
|
安全 编译器 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(上)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
23 0