C++----类型转换
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++----类型转换相关的知识,希望对你有一定的参考价值。
C++类型转换
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; // 0 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关键字详解
以上是关于C++----类型转换的主要内容,如果未能解决你的问题,请参考以下文章