隐式转换和显式转换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隐式转换和显式转换相关的知识,希望对你有一定的参考价值。
C/C++对于数据类型的转换包括隐式转换和显式转换(强制类型转换)。
一般来说,隐式转换包括以下几种情形:
1. 低精度与高精度混合运算,低精度会隐式转换成高精度类型。
int a = 10; double b = 1.2; double c = a + b;//此时a会隐式转换成double类型进行运算。
bool、char、short、int、long、float、double依次向上会发生隐式转换。bool类型向上转换时,false转换成0,true转换成1。
【p.s.】有符号和无符号数之间的转换。当signed类型能够容纳类型转换前的数时,该类型向上转换时转换为signed类型,否则都转换成unsigned类型。
有符号数和无符号数之间的转换会发生符号反转或数据截断。
符号反转是只无符号数与有符号数之间运算,会导致符号发生变化;
数据截断则是指高精度数据用低精度类型保存数据时,发生的高位/低位数据被舍弃的现象。
int a = 300; char b = a;//发生数据截断 b的ascii码是44,实际对应的是, int c = b;//char隐式转换成int 44 unsigned short d = 10; unsigned short e = 65535; short f = d + e;//65545,被截断f=9 short aa = 10; short bb = 32767; short cc = aa + bb;// cc=-32759
2. 非布尔类型会转换成布尔类型。
int a = 10; if (a)//这里会将非0值认为是true { cout << "i am true." << endl; } else { cout << "i am false." << endl; }
3. 指针类型转换。
数组名会转换成指针。当数组作为函数形参时,本身是蜕化成指针的。
可以将NULL(0)赋值给指针类型。
4. 枚举类型。
枚举类型的取值可以与整形进行转换。
C风格的强制转换,在类型前加上(c_type)。如,将double类型强制转换成int:
double pi = 3.1415926; int p = (int) pi;// p = 3
C++风格的强制转换
static_cast<type>、const_cast<type>、dynamic_cast<type>、reinterpret_cast<cast>
通常编译器支持的自动转换,都可以在前面加上static_cast。高精度数据转换成低精度数据时,编译器通常会给出精度损失的告警,
使用static_cast强制转换时,编译器就会忽略这个告警。常用如下:
void *p; double *q = static_cast<double*> (p);//支持指针的强制转换 double Pi= 3.1415926; int pi = static_cast<int> (Pi);//此处不会有warning
const_cast能够将变量的const属性去除。如一个函数的入参是 char*类型,当传入一个const char*时,编译会报错。这时可以使用const_cast去除它的const属性。
#include <iostream> using namespace std; void print(char* s) { cout << s << endl; } int main() { const char* s = "abc"; print(const_cast<char*> (s));//去除s的const属性 return 0; }
dynamic_cast支持运行时识别指针或引用类型所指向的对象。
dynamic_cast使用时先去判断转换是否有效,有效才进行转换。
转换对象是指针时,若转换失败,则转换的结果是NULL指针;若转换对象是引用,若转换失败,则抛出一个bad_cast的异常。
reinterpret_cast通常是在位操作层次上进行的强制转换。转换后一定要记住原始类型,保证后续操作兼容原始类型,否则可能会造成一些奇怪的输出结果。
int *ip; char *pc = reinterpret_cast<char*> (ip); //Coder一定要记住pc所指向的对象实际是int类型的。 string s(pc);//这里s里面的内容很奇怪。
以上是关于隐式转换和显式转换的主要内容,如果未能解决你的问题,请参考以下文章