类型转换
一、隐式转换
int ival = 3.14 + 3;
在执行上述语句时,编译器先将int类型的3转换为double类型,之后相加,再将所得结果转换为int类型初始化ival。
显然,这里的类型转换无须程序员的介入,称之为隐式转换。
1. 算术转换
算数转换就是将一种算术类型(宽度小的)转换为另一种算术类型(宽度大的)。
整型提升
整型提升负责把 小整数类型 转换成 较大的整数类型。
对于bool、char、signed char、unsigned char、short、unsigned short,只要它们所有可能的值都能存在int里,就会转化成int类型,否则转换成unsigned int类型。
2. 其他隐式类型转换
① 数组转换成指针
在大多数用到数组的表达式中,数组 自动转换成 指向数组首元素的指针。
② 指针的转换
常量整数值0 和 字面值nullptr 可以转换为任意类型的指针。
而指向任意非常量的指针能转换成 void*,指向任意对象的指针能转换为const void*。
③ 转换成bool类型
若算术类型和指针类型值为0,则为false,值为1,则为true。
二、显示转换
显示转换也就是我们所说的 强制类型转换。
一个命名的强制类型转换有如下格式:cast-name <type> (expression);
其中, type是目标类型,expression是要转换的值,而cast-name指定了执行的是哪种转换(共 static_cast、dynamic_cast、const_cast、reinterpret_cast 四种)。
static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。
int i = 3, j = 2; double result = static_cast<double>(i) / j;当将一个较大的算术类型赋值给较小的算术类型时,编译器会给出警告,但如果用了static_cast显示转换,警告则会消失。
long a = 100000; int b = static_cast<int>(a);dynamic_cast
dynamic_cast支持运行时类型识别,我们会在后面详细介绍。
const_cast
const_cast只可改变底层const,将常量对象变为非常量对象。
reinterpret_cast
这是一个非常有风险的类型转换。
int *i; char *c = reinterpret_cast<char *>(i); string str(c); //错误上述代码中,用int类型的地址初始化了char类型指针,但是C指向的真实对象是一个int并不是char类型。因此,当我们错误地使用C而编译器不给出警告时,会引起很严重的后果。
由此,在代码中,坚决不要出现隐式转换,尽量杜绝出现显示转换。
本文详细介绍了C++中的类型转换,包括隐式转换和显示转换两大类。隐式转换涉及算术转换、数组转换成指针及指针转换等内容;显示转换即强制类型转换,通过static_cast、dynamic_cast、const_cast和reinterpret_cast四种方式进行。
832

被折叠的 条评论
为什么被折叠?



