C++中类型的转换
来源:互联网 发布:淘宝千里眼好用不 编辑:程序博客网 时间:2024/05/21 04:17
欢迎批评指针
一、C++中内置类型的转换
将一个标准类型变量的值赋给另一个标准类型变量时,如果这两种类型相互兼容,则C++自动将这个值转换为接收变量的类型:
int count = 3.33; //将浮点型自动转化为int型,但是会丢失精度
double time = 11;//将int型转化为浮点型
上述语句都是可行的,因为在C++看来各种数值类型都是相同的东西—-一个数字,并且C++包含用于转换的内置规则。但是对于不兼容的类型,则不能执行自动转换,例如:int *ptr = 10此语句是不能通过编译的,因为一个是指针类型,另一个是整数类型。然而,不能通过自动转换时,可以执行强制类型转换,int *ptr = (int *)10//此语句是正确的。
二、C++中自定义类类型的转换
C++中内置类型的转换太过松散,而不能适用于自定义类类型的转换,为了解决这种松散的情况,C++添加了四种类型转换的运算符,使过程更加规范:
dynamic_cast <type_name>expression;
const_cast <type_name>expression;
static_cast<type_name> expression;
reinterpret_cast<type_name>expression;
其中,type_name为目标类型,expression为源类型。
下面对四种类型转换运算符进行逐一介绍:
①dynamic_cast <type_name>expression
该运算符的作用是,使得能够在类层次结构中进行向上转换,而不允许其它转换。
例如,High和Low是两个类,ph和pl分别为High*和Low*类型,则仅当Low是High可访问的基类时,下面的语句才将Low*指针赋给pl
pl = dynamic_cast<Low *>ph;
否则,该语句将空指针赋值给pl。
②const_cast <type_name>expression
该运算符只执行一种用途的类型转换,即移除变量的const属性,而其它属性不变。也就是说除了const属性不同外,type_name和expression类型必须相同。我们之所以需要这种转换,是因为我们需要这样一个变量,它在大多时候是常量,有时它的值又需要改变的。
例如:High和Low是两个类
High bar;
const High *pbar = &bar;
High *pb = const_cast<High *>pbar;//valid
const Low *pl = const_cast<Low *>pbar;//invalid
第一个转换是合法的,使得*pb成为可以修改bar对象值得指针,它删除了const的标签;第二个转换是非法的,它尝试将const High*转化为const Low*。
③static_cast<type_name> expression
仅当type_name所属的类型可以隐式转换为expression所属的类型时,或者expression所属的类型可以隐式转换为type_name所属的类型时,转换才是有效的。
例如:类A是类B的基类,C是另外不同的类,从类A到类B转换或者从类B到类A的转换都是合法的,而从类C到类A的转换是非法的。
④reinterpret_cast <type_name>expression
interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。如:int i; char *ptr="hello freind!"; i=reinterpret_cast<int>(ptr);这个转换方式很少使用。
- 【C#】中Decimal类型转换的问题
- C中常见的类型转换
- C/C++: C++ 中 static_cast 类型转换的含义
- C语言中类型转换
- 类型转换(c中)
- ANSI C中类型转换
- C/C++中类型转换
- C语言中类型转换
- C++中各种类型的转换
- c中结构体指针的强制类型转换
- C/C++中自动类型转换的规则
- C语言中类型转换时的数据丢失问题
- C语言中int到float的强制类型转换
- C语言中int到float的强制类型转换
- C语言中强制类型转换的总结
- C语言中数据类型的自动类型转换
- C中字符类型和整型的转换
- C#.NET 的 类型转换
- PHPUnit从零开始(2):编写 PHPUnit 测试
- CMD 和 Git 中的设置使用代理
- 前端优化:DNS预解析提升页面速度
- 计算机网络面试知识点整理
- 配置OPENOMR
- C++中类型的转换
- Mac下安装php7.0+php5.6+nginx多版本开发环境
- Android开发错误汇总
- java接口学习例子
- Tomcat负载均衡原理详解及配置(Apache2.2.19+Tomcat7.0.12)
- 栅格系统总结
- Android 入门文档_Android 4.0后JNI所做的更改
- 形式参数和返回值的问题深入研究
- JQ中 :not .not 伪类与方法之间的选择