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

一,隐式类型转换

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

C语言基本数据类型转换

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,因为int转double的优先级高一些。

二,强制类型转换

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

(2)const_cast

(3)static_cast

(4)reinterpret_cast

经验分享 程序员 微信小程序 职场和发展