目录

​一,隐式类型换​

​二,强制类型换​

​三,类型换去const​

​四,强制类型换运算符​


一,隐式类型转换

C/C++都有,包括赋值语句换、初始化时的转换、表达式中的转换、传参时的转换

1,C语言隐式类型转换

1.当类型换出现在表达式时,无论是unsigned还是signed的char和short都会被自动转换成int,如有必要会被转换成unsigned int(如果short与int的大小相同,unsigned short就比int大。这种情况下,unsigned short会被转换成unsigned int)。

在K&R那时的C中,float会被自动换成double(目前的C不是这样)。由于都是从较小类型转换为较大类型,所以这些转换被称为升级。

2.涉及两种类型的运算,两个值会被分别换成两种类型的更高级别。

3.类型的级别从高至低依次是long double、double、float、unsigned long long、long long、unsigned long、long、unsigned int、int。

例外的情况是,当long 和 int 的大小相同时,unsigned int比long的级别高。

4.在赋值表达式语句中,计算的最终结果会被换成被赋值变量的类型。这个过程可能导致类型升级或降级。

5.当作为函数参数传递时,char和short被换成int,float被转换成double

2,C++隐式类型转换

Ranking of implicit conversion sequences

1) Exact match: no conversion required, lvalue-to-rvalue conversion, qualification conversion, function pointer conversion, (since C++17) user-defined conversion of class type to the same class

2) Promotion: integral promotion, floating-point promotion

3) Conversion: integral conversion, floating-point conversion, floating-integral conversion, pointer conversion, pointer-to-member conversion, boolean conversion, user-defined conversion of a derived class to its base

精确匹配、提升、换 三种隐式类型转换(包括里面的各小项)优先级依次降低。

由构造函数完成的隐式换:

class A {
public:
A(int x)
{
this->x = x * x;
}
int x;
};

int f(A a)
{
return a.x + 1;
}

int main()
{
cout << f(3) << " ";
return 0;
}

输出10

相当于:

int main()
{
A b = 3;
cout << f(b) << " ";
return 0;
}

而如果是这样:

int f(A a)
{
return a.x + 1;
}

int f(double a)
{
return a + 2;
}

int main()
{
cout << f(3) << " ";
return 0;
}

则输出5,因为intdouble的优先级高一些。

二,强制类型转换

C/C++都有,写法略有区别

C风格:(int)x

C++风格:int(x)

by the way, (int)(x) 这种写法也是OK的

三,类型转换去const

c语言的const入参毫无约束力:

int f(const int*pp)
{
int *p=pp;
*p=3;
return 0;
}

C++要稍微好一点:

int f(const int*pp)
{
int *p=(int *)pp;
*p=3;
return 0;
}

四,强制类型转换运算符

C语言里面只有(int)这种形式的强制类型换运算符,没有专用的强制类型转换运算符。

C++有4个专用的强制类型换运算符:

dynamic_cast

const_cast

static_cast

reinterpret_cast

发明这4个运算符,是为了严格限制使用场景,使得用法更规范,避免一些不容易发现的错误。

(1)dynamic_cast

C和C++的区别(5)类型转换_运算符

(2)const_cast

C和C++的区别(5)类型转换_运算符_02

(3)static_cast

C和C++的区别(5)类型转换_运算符_03

(4)reinterpret_cast

C和C++的区别(5)类型转换_c++_04

C和C++的区别(5)类型转换_运算符_05