标签:c++类型转换
C++类型转换
在C++语言中,某些类型之间有关联。如果两种类型有关联,那么当程序需要其中一种类型类型的运算对象时,可以用另一种关联类型的对象或者值来替代。
Intival = 3.4 + 3; //编译器提示损失精度
加法的两个运算对象类型不同:3.4为double类型,3位int类型。C++不会将两个不同类型的值直接相加,而是根据类型转换规则设法将运算对象的类型统一后再求值,上述类型转换自动进行,称之为隐式类型转换。
算数类型之间的饮食转换被设计的尽可能避免损失精度。如上:int ival = 3.4 + 3;首先将3转换为double类型,之后与3.4相加,最后赋值,将double类型值赋给int类型,损失了小数部分,所以编译器会发出警告。
隐式类型转换规则(需要转换时):
1 比int类型小的提升为较大的整数类型
2 条件表达式中,非布尔值转换为布尔类型
3 初始化时,初始值转换为变量的类型;赋值时,右侧运算对象转换为左侧运算对象类型
4 若算数运算或者关系运算的运算对象有多种类型,需转换为同一种类型
5 数组转换为指针(赋值,初始化,函数调用是发生)
1 C语言中的类型转换也可用在C++中
如:
int a = 1; double b = 1.1;
显式类型转换方法如下所示
a= (int)b; a= int(b); a= (int)(b)
2 static_cast-任何具有明确定义的类型转换,只要不包含底层const,都可使用static_cast
如:
double value = static_cast<double>(i) / j; void *p = &value; double *dp = static_cast<double*>(p);
3 const_cast-只能改变运算对象底层const(或称之为去const性质)
如:
const char* pc; char *p = const_cast<char*>(pc); //正确,但是通过p写值是未定义的行为
4 reinterpret_cast – 为运算对象的位模式提供较低层次的解释
如:
int *iPtr; char*cPtr = reinterpret_cast<char*>(ip)
这里cPtr将iPtr指向的地址使用使用char*解释,即*cPtr为某个字符
注意:必须谨记cPtr是指向iPtr;若把pc当成普通字符串可能会发生运行时错误
5 dynamic_cast – 用于将基类指针或引用安全的转换为派生类的指针或者引用
如果转换类型是指针并且失败了,则返回0
如果转换目标是引用并且失败了,则抛出bad_cast异常
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:c++类型转换
原文地址:http://blog.csdn.net/u013507368/article/details/48009497