隐式类型转换

         在C++中提供了两种隐式类型转换,一种是只有一个变量的constructors,另一种是隐式类型转换操作符。前者是指能够以单一自变量成功调用的constructor,后者是可以自定义的operator。前者主要带来有的一个并非自己想要的类型转换问题,而后者主要出现在自己编写的类型的代码中,用以提供特定的隐式类型转换。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

         首先是第一种,只有一个变量的constructor,它分有两种情况,第一种是定义的时候就只有一个变量需要传递,第二种是虽然变量较多,但是除了第一个变量以外都设置有默认值,这样的情况也可能出现未知的调用。见下面的两个例子:

class name
{
     name(const string& _inputname);
     name(const string& _firstname, const string& lastname = "undecalred");
};

         其中第一个构造函数就是所谓的单变量gouzao函数,第二个则是第一个变量没有默认值,而剩下的(仅有的第二个)有默认值。

         下面来看一个错误的自动调用隐式类型转换的bug例子(schwarz bug):

         Jerry Schwarz,iostream函数库的作者,在为cin对象提供这样一个conversion:if( cin )时,为他定义了一个operator int(),在使用if( cin )时,cin对象会想办法找出一个恰当的类型转换函数以使这行语句能够通过编译,是的,提供一个operator int()的确在需要它的时候将其转换为了一个int,但是,倘若程序员这样错误的使用cin对象:cin << 1;而令人苦恼的点就是,这样的错误并不会被IDE找出来(仅仅考虑这里是一个operator int()会带来的问题,schwarz当然解决了这个问题,这里只是假设问题依旧存在着),因为编译器会想方设法地让这条语句通过编译,是的它的确能找到,那就是让cin通过隐式类型转换符变成一个int,然后将<<解释成左移。这不符合我们的预期,但是,它符合编译器的预期。

         schwarz的解决办法是将operator int()换成了一个operator void*(),这个bug后来被戏称是”schwarz bug”。        

 

         如今为了阻止这种一个变量的构造函数被用于隐式类型转换操作,c++引入了关键词explict,用于阻止构造函数被用于隐式类型转换。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

         现在让我们来简单的介绍一下隐式类型转换操作符,其定义方式是一个没有返回值,没有参数的函数,它的定义方式是operator 类型名(),例如operator int(),其中int可以换成其他的内置类型,也可以用自己的类型。

转载于:https://www.cnblogs.com/HotPants/p/11448759.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
隐式类型转换,也称为自动类型转换,是在 C++ 编程中的一种自动转换机制,它发生在当一种类型的值被赋给另一种类型的变量时,或者是作为函数参数传递时,目标类型能够自动推导出源类型的情况。这种转换通常是编译器进行的优化处理,旨在简化代码编写,并尽量减少显式转换的需要。隐式转换遵循一些特定的规则和优先顺序,以保证程序的正确性和一致性。 ### 隐式类型转换的主要特点包括: 1. **大小一致的转换**:如果目标类型比原始类型大,则会从较小类型自动转换到较大类型。例如,从 `char` 到 `int` 的转换就是隐式的。 2. **窄化(截断)**:从较大的类型转换到较小的类型时,可能发生信息丢失的情况,此时被称为“窄化”。例如,从 `long long` 转换为 `short` 将丢失精度。 3. **强制类型转换**:有时候虽然隐式转换是合法的,但为了保持代码的明确性和可读性,程序员可以选择使用 `(类型)表达式` 来进行显式转换。 ### 常见的例子: - **整数间的隐式转换**: ```cpp char ch = 'A'; // 字符常量 int i = ch; // 自动转换为整数 ``` - **浮点数和整数之间的转换**: ```cpp float f = 5.6f; // 浮点数 int i = (int)f; // 显式转换为整数,保留小数部分的信息 ``` - **自动数组初始化**: ```cpp int a = {1}; // 初始化为{1, 0, 0} ``` 在此例中,最后一个元素默认填充零,这是一种隐式行为。 ### 注意事项: - **窄化损失**:在进行窄化转换时,一定要注意是否有信息丢失的风险,特别是涉及数学运算时(比如浮点数转整数)。 - **性能考虑**:过多的隐式转换可能导致编译器生成更复杂的机器码,进而影响程序性能。 - **代码可读性**:尽管隐式转换可以提高代码的简洁度,但过度依赖隐式转换也可能降低代码的可读性和可维护性,尤其是在大型项目中。 理解隐式类型转换有助于编写更高效、更容易维护的 C++ 程序。掌握其工作原理及潜在风险对于成为一个熟练的 C++ 开发人员至关重要。如果你对其他方面感兴趣,欢迎提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值