int类型的实参与int*类型的形参不兼容_如何攻克 C++ 中复杂的类型转换?

本文深入探讨了C++中的类型转换,包括隐式类型转换如算术类型转换、转换构造函数和类型转换运算符,以及显式类型转换的使用。特别强调了不同类型转换在不同场景下的应用,如类型提升、转换构造函数的`explicit`关键字以及阻止向上类型转换的方法。此外,还提到了多重继承和向上类型转换的情况,并列举了C++中的其他特殊隐式类型转换案例。
摘要由CSDN通过智能技术生成

fa0b725b63a887be227cc114eb07512e.png

引言

不同的数据在计算机内存中的存储方式不同,导致了“类型”这一抽象概念的出现。

对于一个变量而言,其必须要回答三个问题:

1. 在哪可以访问到这个变量的起点?

2. 从起点向后需要读取多少内存?

3. 应该如何解析读取到的二进制数据?

上述的三个问题中,问题 1,由内存地址回答,问题 2 和 3,均由类型回答。

由此可见,类型与内存地址共同构成了一个变量的完整组分。之所以不能对 void 取值,也是由于无法回答问题 2 和 3 导致。

进一步的,我们可以得到一条十分重要的结论:对于两个不同类型的变量,由于其对问题 2 和 3 的答案不同,故如果将这样的两个变量直接进行运算,在绝大多数情况下都将无法产生有价值的计算结果。

故在几乎所有的编程语言中都有一条重要的规定:不同类型的两个变量无法直接进行运算。

虽然不同类型的两个变量无法进行运算,但显然,我们可将其中的一个变量通过类型转换,转为与另一个变量类型一致,此时就满足“同类型变量才能进行运算”这一规定了。

同时,由于某些类型转换是“理所应当”的,而另一些不是,故由此又派生出两个概念:隐式类型转换与显式类型转换。

隐式类型转换指不通过专门的类型转换操作,而是通过其它规定或代码上下文隐式发生的类型转换,而显式类型转换则通过专门的类型转换操作进行转换,显式类型转换具有强制性,其将不受任何类型转换以外的因素影响,故显式类型转换又称为强制类型转换 。

在 C++ 中,类型转换是一个非常复杂的话题。本文将先从隐式类型转换入手,逐步讨论各类 C++ 的类型转换话题。

类型提升与算术类型转换

算术类型转换专指 C++ 提供的各种内置算术类型之间的隐式类型转换。

内置算术类型主要包括以下类型:

1. bool

2. char, signed char, unsigned char

3. short, int, long, long long, unsignedshort, unsigned int, unsigned long, unsigned long long

4. float, double, long double

5. size_t, ptrdiff_t, nullptr_t 等其它特殊类型

算术类型转换是一类不完全明确的,且与底层密切相关的隐式类型转换。

其遵循以下几条主要原则:

1. 对于同类算术类型,如short 与 int,float 与 double,占用较小内存的类型将转换成另一类型。如 short+ int将被转换为 int + int。此种类型转换称为类型提升。

2. 整形将转为浮点型。如 int+ double 将被转换为 double + double。

3. 仅当无符号类型占用的内存小于有符号类型时,无符号类型才发生类型提升从而转为有符号类型,否则,有符号类型将转为无符号类型。这是一个非常需要注意的点。

参考以下代码:

int main

{

unsignedshorta = 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值