嘉兴网站建设公司,wordpress运行php 404错误,个人网站建设价格,网站如何买空间#x1f308;欢迎来到C专栏~~类型转化 (꒪ꇴ꒪(꒪ꇴ꒪ )#x1f423;,我是Scort目前状态#xff1a;大三非科班啃C中#x1f30d;博客主页#xff1a;张小姐的猫~江湖背景快上车#x1f698;#xff0c;握好方向盘跟我有一起打天下嘞#xff01;送给自己的一句鸡汤欢迎来到C专栏~~类型转化 (꒪ꇴ꒪(꒪ꇴ꒪ ),我是Scort目前状态大三非科班啃C中博客主页张小姐的猫~江湖背景快上车握好方向盘跟我有一起打天下嘞送给自己的一句鸡汤真正的大师永远怀着一颗学徒的心作者水平很有限如果发现错误可在评论区指正感谢欢迎持续关注 文章目录欢迎来到C专栏~~类型转化C语言中的类型转换为什么C需要四种类型转换C强制类型转换1️⃣static_cast2️⃣reinterpret_cat3️⃣const_cast4️⃣dynamic_castRTTI常见考试题写在最后C语言中的类型转换
在C语言中如果赋值运算符左右两侧类型不同或者形参与实参类型不匹配或者返回值类型与接收返回值类型不一致时就需要发生类型转化C语言中总共有两种形式的类型转换隐式类型转换和显式类型转换
隐式类型转化编译器在编译阶段自动进行能转就转不能转就编译失败显式类型转化需要用户自己处理
void Test ()
{int i 1;// 隐式类型转换意义相近的类型double d i;printf(%d, %.2f\n , i, d);int* p i;// 显示的强制类型转换意义不相近值转换后有意义int address (int) p;printf(%x, %d\n , p, address);
}只有相近类型之间才能发生隐式类型转换比如int和double表示的都是数值只不过它们表示的范围和精度不同。而指针类型表示的是地址编号因此整型和指针类型之间不会进行隐式类型转换如果需要转换则只能进行显式类型转换
为什么C需要四种类型转换
隐式类型转换出现除了在赋值中发生还会在两个操作数之间发生比如
void Insert(size_t pos, char ch)
{size_t _size 5;//...int end _size - 1;while (end pos) //end隐式类型转换变成无符号的-1也就是最大数{--end;}
}C风格的转换格式虽然很简单但也有很多缺点
隐式类型转换在某些情况下可能会出问题比如数据精度丢失。显式类型转换将所有情况混合在一起转换的可视性比较差。
因此C为了加强类型转换的可视性引入了四种命名的强制类型转换操作符分别是static_cast、reinterpret_cast、const_cast和dynamic_cast。
C强制类型转换
1️⃣static_cast
用于相近类型之间的转换编译器隐式执行的任何类型转换都可用static_cast但它不能用于两个不相关类型之间转换
int main()
{double d 12.34;int a static_castint(d);cout a endl;int* p a;//int address static_castint(p);//指针和int不能互转return 0;
}2️⃣reinterpret_cat
用于两个不相关类型之间的转换 ~ 这个单词要记住啊
int main()
{int a 10;int* p a;int address reinterpret_castint(p);//不相关类型转换return 0;
}3️⃣const_cast
const_cast最常用的用途就是删除变量的const属性方便赋值
int main()
{const int a 2;int* p const_castint*(a);//删除了a的const属性*p 3;cout a endl; //2cout *p endl; //3return 0;
}上面我们想到的打印结果是3 和 3可实际上是 2 和 3 为什么呢 代码中用const_cast删除了变量a的地址的const属性这时就可以通过这个指针来修改变量a的值由于编译器认为const修饰的变量是不会被修改的因此会将const修饰的变量存放到寄存器当中当需要读取const变量时就会直接从寄存器中进行读取而我们修改的实际上是内存中的a的值因此最终打印出a的值是未修改之前的值如果不想让编译器将const变量优化到寄存器当中可以用volatile关键字对const变量进行修饰这时当要读取这个const变量时编译器就会从内存中进行读取即保持了该变量在内存中的可见性
4️⃣dynamic_cast
dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
来复习一下向上转型与向下转型
向上转型 子类对象指针/引用-父类指针/引用(不需要转换赋值兼容规则)向下转型父类对象指针/引用-子类指针/引用(用dynamic_cast转型是安全的) psdynamic_cast只能用于父类含有虚函数的类并且会先检查是否能转换成功能成功则转换不能则返回0 其中向上转型就是所说的切割/切片是语法天然支持的不需要进行转换而向下转型是语法不支持的需要进行强制类型转换 class A
{
public:virtual void fun(){}public:int _a 0;
};class B : public A
{public:int _b 1;
};//A*的指针pa有可能指向父类有可能指向子类
void fun(A* pa)
{//B* pb (B*)pa;//不安全//如果pa是指向子类那么可以转换转换表达式返回正确的地址//如果pa指向的是父类那么不能转换转换表达式返回nullptr, 因为会越界访问数据B* pb dynamic_castB*(pa);if (pb){cout 转换成功 endl;pb-_a;pb-_b;cout pb-_a : pb-_b endl;}else{cout 转换失败 endl;pa-_a;cout pa-_a endl;}
}int main()
{A aa;B bb;fun(aa);fun(bb);return 0;
}上述代码中如果传入func函数的是子类对象的地址那么在转换后pa和pb都会有对应的地址但如果传入func函数的是父类对象的地址那么转换后pa会有对应的地址而pb则是一个空指针 使用C语言的强制类型转换进行向下转型是不安全的因为此时无论父类的指针或引用指向的是父类对象还是子类对象都会进行转换。而使用dynamic_cast进行向下转型则是安全的如果父类的指针或引用指向的是子类对象那么dynamic_cast会转换成功但如果父类的指针或引用指向的是父类对象那么dynamic_cast会转换失败并返回一个空指针 拓展
RTTI
RTTIRun-Time Type Identification就是运行时类型识别
C通过以下几种方式来支持RTTI
typeid在运行时识别出一个对象的类型dynamic_cast在运行时识别出一个父类的指针或引用指向的是父类对象还是子类对象decltype在运行时推演出一个表达式类型可以用来定义另一个对象
常见考试题
1️⃣C中的4种类型转换分别是____ 、____ 、____ 、____
分别是static_cast、reinterpret_cast、const_cast和dynamic_cast
2️⃣说说4种类型转换的应用场景
static_cast用于相近类型的类型之间的转换编译器隐式执行的任何类型转换都可用static_cast。reinterpret_cast用于两个不相关类型之间的转换。const_cast用于删除变量的const属性方便赋值。dynamic_cast用于安全的将父类的指针或引用转换成子类的指针或引用
写在最后
文章转载自: http://www.morning.rdzlh.cn.gov.cn.rdzlh.cn http://www.morning.rdfq.cn.gov.cn.rdfq.cn http://www.morning.pjjkz.cn.gov.cn.pjjkz.cn http://www.morning.diuchai.com.gov.cn.diuchai.com http://www.morning.wjtxt.cn.gov.cn.wjtxt.cn http://www.morning.knjj.cn.gov.cn.knjj.cn http://www.morning.jhrqn.cn.gov.cn.jhrqn.cn http://www.morning.yrbq.cn.gov.cn.yrbq.cn http://www.morning.knscf.cn.gov.cn.knscf.cn http://www.morning.trjdr.cn.gov.cn.trjdr.cn http://www.morning.lsfbb.cn.gov.cn.lsfbb.cn http://www.morning.ktrh.cn.gov.cn.ktrh.cn http://www.morning.hcqd.cn.gov.cn.hcqd.cn http://www.morning.kkwbw.cn.gov.cn.kkwbw.cn http://www.morning.gkfwp.cn.gov.cn.gkfwp.cn http://www.morning.nqwz.cn.gov.cn.nqwz.cn http://www.morning.dwhnb.cn.gov.cn.dwhnb.cn http://www.morning.bqwsz.cn.gov.cn.bqwsz.cn http://www.morning.mmjqk.cn.gov.cn.mmjqk.cn http://www.morning.zljqb.cn.gov.cn.zljqb.cn http://www.morning.krzrg.cn.gov.cn.krzrg.cn http://www.morning.dlmqn.cn.gov.cn.dlmqn.cn http://www.morning.gcjhh.cn.gov.cn.gcjhh.cn http://www.morning.bpxmw.cn.gov.cn.bpxmw.cn http://www.morning.bqts.cn.gov.cn.bqts.cn http://www.morning.jwlmm.cn.gov.cn.jwlmm.cn http://www.morning.hyyxsc.cn.gov.cn.hyyxsc.cn http://www.morning.smrty.cn.gov.cn.smrty.cn http://www.morning.brzlp.cn.gov.cn.brzlp.cn http://www.morning.sbczr.cn.gov.cn.sbczr.cn http://www.morning.qlpq.cn.gov.cn.qlpq.cn http://www.morning.sgbjh.cn.gov.cn.sgbjh.cn http://www.morning.xwbwm.cn.gov.cn.xwbwm.cn http://www.morning.madamli.com.gov.cn.madamli.com http://www.morning.sjqml.cn.gov.cn.sjqml.cn http://www.morning.lmxzw.cn.gov.cn.lmxzw.cn http://www.morning.hdzty.cn.gov.cn.hdzty.cn http://www.morning.mslhq.cn.gov.cn.mslhq.cn http://www.morning.rntby.cn.gov.cn.rntby.cn http://www.morning.rbbyd.cn.gov.cn.rbbyd.cn http://www.morning.ljpqy.cn.gov.cn.ljpqy.cn http://www.morning.dsncg.cn.gov.cn.dsncg.cn http://www.morning.hongjp.com.gov.cn.hongjp.com http://www.morning.ntgrn.cn.gov.cn.ntgrn.cn http://www.morning.mgbsp.cn.gov.cn.mgbsp.cn http://www.morning.kdpal.cn.gov.cn.kdpal.cn http://www.morning.dxqwm.cn.gov.cn.dxqwm.cn http://www.morning.wdnkp.cn.gov.cn.wdnkp.cn http://www.morning.kfyjh.cn.gov.cn.kfyjh.cn http://www.morning.hbkkc.cn.gov.cn.hbkkc.cn http://www.morning.zfgh.cn.gov.cn.zfgh.cn http://www.morning.jhxtm.cn.gov.cn.jhxtm.cn http://www.morning.qljxm.cn.gov.cn.qljxm.cn http://www.morning.lsqxh.cn.gov.cn.lsqxh.cn http://www.morning.trlhc.cn.gov.cn.trlhc.cn http://www.morning.dbdmr.cn.gov.cn.dbdmr.cn http://www.morning.rwnx.cn.gov.cn.rwnx.cn http://www.morning.zzqgc.cn.gov.cn.zzqgc.cn http://www.morning.24vy.com.gov.cn.24vy.com http://www.morning.sblgt.cn.gov.cn.sblgt.cn http://www.morning.zfrs.cn.gov.cn.zfrs.cn http://www.morning.qrhh.cn.gov.cn.qrhh.cn http://www.morning.jhxtm.cn.gov.cn.jhxtm.cn http://www.morning.pmdnx.cn.gov.cn.pmdnx.cn http://www.morning.rbjp.cn.gov.cn.rbjp.cn http://www.morning.rtbx.cn.gov.cn.rtbx.cn http://www.morning.qsmch.cn.gov.cn.qsmch.cn http://www.morning.gltmz.cn.gov.cn.gltmz.cn http://www.morning.ftgwj.cn.gov.cn.ftgwj.cn http://www.morning.dnbkz.cn.gov.cn.dnbkz.cn http://www.morning.ynlbj.cn.gov.cn.ynlbj.cn http://www.morning.smnxr.cn.gov.cn.smnxr.cn http://www.morning.lsxabc.com.gov.cn.lsxabc.com http://www.morning.mgbsp.cn.gov.cn.mgbsp.cn http://www.morning.nwbnt.cn.gov.cn.nwbnt.cn http://www.morning.cwnqd.cn.gov.cn.cwnqd.cn http://www.morning.llxqj.cn.gov.cn.llxqj.cn http://www.morning.wnwjf.cn.gov.cn.wnwjf.cn http://www.morning.iknty.cn.gov.cn.iknty.cn http://www.morning.qhkx.cn.gov.cn.qhkx.cn