哈尔滨网站建设报价,品牌关键词排名优化怎么做,二 网站建设的目的及功能定位,佛山品牌网站建设#x1f496;作者#xff1a;小树苗渴望变成参天大树#x1f388; #x1f389;作者宣言#xff1a;认真写好每一篇博客#x1f4a4; #x1f38a;作者gitee:gitee✨ #x1f49e;作者专栏#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法#x1f384; 如 果 你 … 作者小树苗渴望变成参天大树 作者宣言认真写好每一篇博客 作者gitee:gitee✨ 作者专栏C语言,数据结构初阶,Linux,C 动态规划算法 如 果 你 喜 欢 作 者 的 文 章 就 给 作 者 点 点 关 注 吧 文章目录 前言一、C语言的类型转换二、为什么C需要四种类型转换三、 C强制类型转换四、总结 前言
今天将一个知识量不是很大而且建议使用的东西相信大家看到类型转换的时候就觉得这不是C语言的时候就学了吗为什么现在拿出来提但又看到C的类型转换说明这是C新出来的大家都是知道C是兼容c语言的所以再C里面的类型转换再C里面也适用而今天将的是C里面的类型转换是为了规范C语言里面类型转换出现的不安全问题所以接下来我们就来进入正文进行讲解。 一、C语言的类型转换
在C语言中如果赋值运算符左右两侧类型不同或者形参与实参类型不匹配或者返回值类型与 接收返回值类型不一致时就需要发生类型转化C语言中总共有两种形式的类型转换隐式类型 转换和显式类型转换
显示类型转换 我们来看案例
int main()
{//显示的类型转换//相关类型的显示类型转换int i 0;int* p i; int address (int)p;double b 1.1;//可能会造成精度丢失i (int)b;//不相关类型的显示类型转换vectorint v;string s;v (vectorint)s;return 0;
}隐式类型转换
void insert(size_t pos, char ch)
{int end 10;while (end pos)//会进行隐式类型转换将end类型转换成int,会死循环{cout end endl;//...--end;}
}double b 1.1;
i b;const变量也可以修改 const int n 10;//转换有安全隐患的int* p (int*)n;(*p);cout n endl;cout *p endl;大家看到从监视窗口看到的值和打印的值不一样原因就是监视窗口里面的值是内存里面里面的值而打印的时候没有直接去内存里面去拿值而是再寄存器的时候直接进行的替换我们可以使用一个关键字让他到内存里面取volatile 上面的办法就是让const去掉常性。 上面的几种场景我们发现都可能会出现问题而且每种转换可视性较差所以的转换都是相同的方式再前面加类型就可以看需要人自己来判断。
二、为什么C需要四种类型转换
C风格的转换格式很简单但是有不少缺点的
隐式类型转化有些情况下可能会出问题比如数据精度丢失显式类型转换将所有情况混合在一起代码不够清晰 因此C提出了自己的类型转化风格注意因为C要兼容C语言所以C中还可以使用C语言的转化风但是建议使用c11出来的风格。
三、 C强制类型转换
标准C为了加强类型转换的可视性引入了四种命名的强制类型转换操作符 static_cast、reinterpret_cast、const_cast、dynamic_cast 1static_cast用于非多态类型的转换静态转换编译器隐式执行的任何类型转换都可用 static_cast但它不能用于两个不相关的类型进行转换 double b 1.1;
i static_castint(b);
这样就可以很好的知道这是隐式类型转换。
2reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释用于将一种类型转换 为另一种不同的类型
double d 12.34;int a static_castint(d);cout a endl;// 这里使用static_cast会报错应该使用reinterpret_cast//int *p static_castint*(a);int *p reinterpret_castint*(a);3const_cast最常用的用途就是删除变量的const属性方便赋值 int* p const_cast int*(a );*p 3;couta endl;4dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换) 向上转型子类对象指针/引用-父类指针/引用(不需要转换赋值兼容规则) 向下转型父类对象指针/引用-子类指针/引用(用dynamic_cast转型是安全的)
dynamic_cast只能用于父类含有虚函数的类dynamic_cast会先检查是否能转换成功能成功则转换不能则返回0
这是指针c特有的c语言没有继承 我们来看一个例子
class a
{
public:virtual void f() {}int _x 0;
};class b : public a
{
public:int _y 0;
};
void fun(A* pa)
{B* pb (B*)pa;pb-_x;pb-_y;
}int main()
{A aa;fun(aa);B bb;fun(bb);return 0;
}我们再传参的时候形参接收实参的过程是向上转型没有问题但是函数体里面有一个将父类指针强转给子类指针第一中会报错原因是我们B*让pa的访问范围变大了本来就智能访问_x,现在可以访问_y,而A类里面没有_y就会报错这种错误我们是很难知道的所以需要使用 dynamic_cast
void fun(A* pa)
{//pa是指向子类对象B的转换可以成功正常返回地址// pa是指向父类对象A的转换失败返回空指针B* pb dynamic_castB*(pa);if (pb){cout 转换成功 endl;pb-_x;pb-_y;}else{cout 转换失败 endl;}
}这样就很好的避免我们上面会出现到的问题了 注意 强制类型转换关闭或挂起了正常的类型检查每次使用强制类型转换前程序员应该仔细考虑是 否还有其他不同的方法达到同一目的如果非强制类型转换不可则应限制强制转换值的作用 域以减少发生错误的机会。强烈建议避免使用强制类型转换 四、总结
到这里面我们的类型转换就讲解完毕了大家再平时中试着慢慢使用这些对以后再开发中又帮助可以帮助我们减少很多不必要的麻烦这节的内容不难大家下来好好的去理解一下我么拿下篇介绍特殊类的设计。