C语言类型转换
- 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
int i = 1;
double d = i;
printf("%d, %.2f\n", i, d);
int* p = &i;
int address = (int)p;
- 整形提升
int遇到unsigned int产生中间变量将int整形提升为unsigned int再进行比较,死循环
size_t pos;
cin >> pos;
int n = 5;
while (n >= pos)
{
cout << n << endl;
--n;
}
C++类型转换
意义:
- 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
- 显式类型转换将所有情况混合在一起,代码不够清晰
static_cast
相关类型的转换:static_cast对应C语言的隐式类型转换 static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换 看到static_cast就标识是相关类型转换 不相关类型不行
reinterpret_cast
不相关类型转换:reinterpret_cast reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型
const_cast
const_cast最常用的用途就是删除变量的const属性,方便赋值,虽然可以直接(int)强制类型转换,但是C语言不规范* 但是我们看到a未被修改,这时编译器优化,改为volatile const int a = 2;直接从内存里取
注意:const变量可以通过取地址修改
dynamic_cast
dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
- 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)----
切割/切片 - 向下转型:父类对象指针/引用-
子类指针/引用(用dynamic_cast转型是安全的) 注意
- dynamic_cast
只能用于含有虚函数的类 - dynamic_cast
会先检查是否能转换成功,能成功则转换,不能则返回0
例如:
class A
{
public:
virtual void f() {}
private:
int _a = 1;
};
class B : public A
{
public:
int _b = 1;
};
- pa如果是指向父类对象,严格来说是不能转的,因为存在风险,访问时存在越界风险
- pa如果是指向子类对象,可以转换,是安全的
- 如果使用c的强制类型转换,那么这里是不安全的,无法识别上面的两种情况,建议是使用dynamic_cast,他是安全的。如果是第2种情况可以转换成功,第1种情况转换失败,返回NULL
成功: 失败:
explicit
explicit为清晰的;明确的之意.顾名思义,关键字explicit可以阻止隐式转换的发生. 参考:C++ 中explicit关键字详解
|