网站定制公司选哪家,怎么自建设部网站查询公司资质,线上推广平台都有哪些,深圳手机端网站建设设计公司文章目录 1. C语言中的类型转换2. C中的类型转换2.1 static_cast2.2 reinterpret_cast2.3 const_cast2.4 dynamic 1. C语言中的类型转换
在C语言中#xff0c;经常会出现一种情况#xff1a;运算符两边的类型不同#xff0c;或者形参实参类型不匹配#xff0c;此时就会发生… 文章目录 1. C语言中的类型转换2. C中的类型转换2.1 static_cast2.2 reinterpret_cast2.3 const_cast2.4 dynamic 1. C语言中的类型转换
在C语言中经常会出现一种情况运算符两边的类型不同或者形参实参类型不匹配此时就会发生类型转化。在C语言中类型转化分为两种隐式类型转换和显式类型转换。
隐式类型转换编译器在变异阶段自动进行如果能转换就自动转换不能就报错显示类型转换用户自己处理
void test1()
{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);
}隐式类型转化有些情况下可能会出问题: 比如数据精度丢失显式类型转换将所有情况混合在一起代码不够清晰 2. C中的类型转换
由于C语言的类型转换的缺陷C为了加强类型转换的可视性引入了四种命名的强制类型转换操作符static_cast、reinterpret_cast、 const_cast、 dynamic_cast
2.1 static_cast
static_cast用于非多态类型的转换(静态转换)编译器隐式执行的任何类型转换都可用static_cast但它不能用于两个不相关的类型进行转换
用法static_casttypename(variablename)其中typename是将要转换的类型variablename是要被转换的变量。
void test1()
{double d 12.34;int a static_castint(d);int b d;cout a b endl;
}总结static_cast对标C语言类型转换的隐式类型转换要求两个类型必须要相关 2.2 reinterpret_cast
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释用于将一种类型转换 为另一种不同的类型
void test2()
{int a 12;//int* p static_castint*(a);//这里使用static_cast就会报错int* p reinterpret_castint*(a);cout p endl;
}总结reinterpret_cast对标的是C语言的强制类型转换不要求两个类型是相关类型 2.3 const_cast
const_cast最常用的用途就是删除变量的const属性方便赋值
void test3()
{const int a 10;//a 20;//这里由于a是const修饰的变量所以不能修改int* p const_castint*(a);*p 20;cout a *p endl;
}拓展知识如果运行上述的test3代码就会发现打印出来的a和*p的值并不一样这是什么原因呢 这是因为对于const修饰的变量编译器会认为它不会被修改所以会存放在一个寄存器内部每次访问的时候直接访问寄存器内部的值所以不会更改。如果想要让他每次都从内存中访问的话需要加上volatile关键字。 2.4 dynamic
dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换) 这里补充一下向上转换和向下转换的概念 向上转换由子类对象/指针/引用向父类对象/指针/引用的转换 向下转换由父类对象/指针/引用向子类对象/指针/引用的转换 其中向上转换是天然被允许的中间没有类型转换也不会产生临时对象但是向下转换可能会出现数组越界之类的问题因此是不安全的 class A
{
public:virtual void f() {}int _a 1;
};
class B : public A
{
public:void f() {}int _b 2;
};
void func(A* ptr)
{B* bptr (B*)ptr;cout bptr-_b endl;cout bptr-_a endl;
}
void test4()
{A aa;B bb;func(aa);func(bb);
}这里对于A类型的对象如果要访问_b成员就会出现越界访问的问题。 而dynamic_cast 的作用就是将一个父类对象的指针/引用转换为子类对象的指针或引用 (向下转型)。需要注意的是
dynamic_cast只能用于父类含有虚函数的类。dynamic_cast会检查是否能转换成功能则进行转换不能则返回nullptr。
void func(A* ptr)
{//B* bptr (B*)ptr;B* bptr dynamic_castB*(ptr);if(bptr nullptr){cout 类型转换错误出现向下转换 endl;return;}cout bptr-_b endl;cout bptr-_a endl;
}注意一般情况下我们应该避免使用强制类型转换因为强制类型转换关闭或挂起了正常的类型检查所以每次在使用强制类型转换前程序员应该仔细考虑是否还有其他不同的方法达到同一目的如果非强制类型转换不可则应限制强制转换值的作用域以减少发生错误的机会。 本节完…