网页制作与网站建设实战大全 豆瓣,php网站开发环境,高级网页设计教程,搭建一个网站要多久一、静态类型转换#xff08;static_cast#xff09;
静态类型的转换主要用于基本类型之间的转换#xff0c;比如int类型转换为double类型。但是static_cast也可以支持上下行的转换#xff08;存在继承关系之间的转换#xff09;
基本类型之间的转换举例 上下行转换的举…一、静态类型转换static_cast
静态类型的转换主要用于基本类型之间的转换比如int类型转换为double类型。但是static_cast也可以支持上下行的转换存在继承关系之间的转换
基本类型之间的转换举例 上下行转换的举例
#include iostream
#includetypeinfo
using namespace std;class A
{
public:int a1;int b2;int c3;};class B:public A
{
public:int d4;int e5;int f6;
};int main()
{//用指针实例化一个类对象A *ptr_anew A();B *ptr_bnew B();coutA的数据:ptr_a-aendlB的数据:ptr_b-dendl;//A指向B,B指向AA *ptr_a1static_castA *(new B());//上行转换(子类强行转换为父类)安全B *ptr_b1static_castB *(new A());//下行转换(父类强行转换为子类)不安全容易越界因为父类只能访问自己的coutA指针访问数据:ptr_a1-cendlB指针访问数据:ptr_b1-fendl;return 0;
}从输出结果看下行转换是支持的输出了数据结合源代码可知26708不是我们想要输出的数据指针访问越界了A是基类只能访问自己的空间也证明了继承关系不具有双向性继承关系是单向的 二、动态类型转换dynamic_cast
动态类型的转换主要用来转换存在继承关系的指针或引用类型相比于静态类型转换static_cast动态类型转换会进行类型检查如果转换不安全会抛出异常错误信息
#include iostream
#includetypeinfo
using namespace std;class A
{
public:int a1;int b2;int c3;};class B:public A
{
public:int d4;int e5;int f6;
};int main()
{//用指针实例化一个类对象A *ptr_anew A();B *ptr_bnew B();coutA的数据:ptr_a-aendlB的数据:ptr_b-dendl;//A指向B,B指向AA *ptr_a1dynamic_castA *(new B());//上行转换(子类强行转换为父类)安全B *ptr_b1dynamic_castB *(new A());//下行转换(父类强行转换为子类)不安全容易越界因为父类只能访问自己的coutA指针访问数据:ptr_a1-cendlB指针访问数据:ptr_b1-fendl;return 0;
}这段代码运行之后会报异常信息 D:\study\STL\class_cast\main.cpp:31: error: cannot dynamic_cast (operator new(12u), (statement, ((A*)anonymous))) (of type class A*) to type class B* (source type is not polymorphic) B *ptr_b1dynamic_castB *(new A());//下行转换(父类强行转换为子类)不安全容易越界因为父类只能访问自己的 ^ 说明dynamic_cast只支持上行类型转换子类转换为父类。
三、常量类型转换const_cast
常量类型转换常用来去除指针或引用的常量性。对于指针或引用常量转换可以将其修改为非常量。例如
tips:通过指针b可以修改第三方的值 需要注意的是如果修饰某个变量为常量则不可更改数据但是未修饰的变量可以更改数据
#include iostream
using namespace std;int main()
{int c6;const int *ac;//const修饰的a为常量属性a不可被修改int *bconst_castint *(a);//类型转换后可以被修改cout*a *b cendl;*b9;cout*a *b cendl;int num666;const int *ptr_numconst_castconst int *(num);cout*ptr_num numendl;num999;cout*ptr_num numendl;return 0;
}输出结果 四、重新解释转换reinterpret_cast
重新解释转换用于将一个指针转换为其他类型的指针该类型转换危险程度极高容易造成未定义的行为。
reinterpret_cast支持基本类型指针之间的转换 也支持上下行类型之间的转换包括不相关的类类型之间的转换
#include iostream
using namespace std;
class A
{
public:int a1;int b2;int c3;};class B:public A
{
public:int d4;int e5;int f6;
};class C
{
public:int g7;int h8;int i9;
};int main()
{//用指针实例化一个类对象A *ptr_anew A();B *ptr_bnew B();C *ptr_cnew C();coutA的数据:ptr_a-aendlB的数据:ptr_b-dendlC的数据:ptr_c-gendl;;//A指向B,B指向A,C指向A,A指向C,B指向C,C指向BA *ptr_a1reinterpret_castA *(new B());B *ptr_b1reinterpret_castB *(new A());C *ptr_c1reinterpret_castC *(new A());A *ptr_a2reinterpret_castA *(new C());B *ptr_b2reinterpret_castB *(new C());C *ptr_c2reinterpret_castC *(new B());coutA指针访问数据:ptr_a1-a ptr_a2-cendlB指针访问数据:ptr_b1-f ptr_b2-aendlC指针访问的数据:ptr_c1-g ptr_c2-iendl;return 0;
}运行结果
ps:通过运行结果可知数据访问乱了 其他
上下行转换关系图
父类与子类关系可以理解为基类与派生类关系 其余类型转换方法
类型转换方法其实远不止四个比如自动类型转换系统会自动转换 规则占用内存字节数少的类型向占用内存字节数多的类型转换内存字节数可以用值域替代目的保证精度不降。
编写程序证明有符号类型自动转换为无符号类型最终输出结果为无符号类型 ps2强制类型转换
强制转换的类型被转换的表达式
编写程序自证类型发生了强制转换