您的位置:首页 >公共 >

C++ 类型转换

2023-03-28 21:09:48 来源:哔哩哔哩

隐式类型转换

1大多数表达式中,比int型小的整型值首先提升为较大的整数类型

2在条件中,非bool值转换为bool值


(相关资料图)

3初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转换成左侧运算对象的类型。

4如果算术运算或关系运算的运算对象有多种类型,需要转换成同一种类型。(如double和int

5函数调用时也会发生类型转换。

算术转换

算术转换定义了一套类型转换的层次,其中运算符的运算对象将转换成最宽的类型。如long double参与了运算,那么无论另外一个对象是什么类型都会转化为long double,还有既有浮点型也有整型的时候。

整型提升

把小整数的类型转换成较大的整数类型

如 bool,char,signed char,unsigned char,short,unsigned short等,只要他们所有可能的值都在int中,他们就会提升为int,否则提升成unsigned int类型。

较大的char类型(wchar_t、char16_t、char32_t)提升为int、unsigned int、unsigned long、long long和unsigned long long中最小的一个,前提是转换后的能包含原类型所有可能的值。

无符号类型的运算对象

如果一个运算对象是有符号另一个是无符号,其中无符号不小于由符号,那么有符号的运算对象会转换为无符号,如unsigned int和int,则int类型的运算对象转换成unsigned int类型,需注意如果int型恰好为负值,那么就会产生这种转换的副作用,即转换成不是我们本意的一个数。如果有符号类型大于无符号,则此转换结果依赖于机器,如果无符号类型的所有值都能存在该有符号的类型中,则无符号转换为有符号,如果不能则有符号转换为无符号。

其他隐式类型转换

数组转换为指针:大多数用到数组的表达式中,数组自动转换指向数组首元素的指针

当数组作为取址符&、sizeof、typeid(后面将介绍)等运算符的运算对象时,上述转换不会发生,同样的如果用一个引用来初始化数组,上述转化也不会发生,后面我们将介绍,当表达式中使用函数类型时会发生类似的指针转换。

指针的转换:常量整数值0或者字面值nullptr能转换为任意指针类型;指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void*。后面会介绍有继承关系的类型间有一种指针转换方式。

转换为常量:允许将非常量指针转换成指向相应常量的指针,引用同样如此

不能试图删掉底层的const。

显示转换

有时候我们想将一种对象强制转换为另一种对象。

如果我们希望上面的代码强行执行浮点数除法就要使用某种方法将i或j显式的转换成double,这种方法称之为强制类型转换。

注意:强制类型转换其实相当的危险!!

命名的强制类型转换

一个命名的强制类型转换具有如下形式

cast-name<type>(expression)

type时转换的目标类型而expression时要转换的值。如果type时引用类型,则结果时左值。

cast-name是static_cast、dynamic_cast、const_cast、reinterpret_cast中的一种,dynamic_cast支持运行时类型识别,我们以后做更详细的介绍,cast-name执行的是那种转换。

static_cast

任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。例如将一个运算对象强制转换为double类型就能使表达式执行浮点数除法

const_cast

const_cast只能改变运算对象的底层const

对于将常量对象转换为非常量对象的行为,我们一般称为去掉const性质,一旦我们去掉了某个对象的const性质,编译器就不在阻止我们对该对象进行写操作了。如果对象本身不是一个常量,使用强制类型转换获得写权限时合法的行为。如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果。

const_cast不能用来改变表达式的类型

reinterpret_cast

reinterpret_cast通常为运算对象的位模式提供较低层次上的重新解释。

这里pc所指的真是对象其实时int而非字符

除非对类型和编译器的转换十分了解否则不要轻易使用reinterpret_cast。

旧式强制类型转换

根据类型的不同,旧式强制转换类型分别具有const_cast、static_cast、或者reinterpret_cast相似的行为。当我们执行旧式强制类型转换时,如果换成const_cast、static_cast也合法,则其行为与对应的命名转换一致,如果替换后不合法,则执行于reinterpret_cast类似的操作。

效果与reinterpret_cast一致。

运算符优先级表

标签: