两种参数类型_记住这个,能少走弯路,C++两种隐式类型转换

本文聚焦C++的两种隐式类型转换。先介绍operator隐式类型转换,即隐式将当前对象生成其他类型对象;接着说明构造函数的隐式类型转换,是用其他类型构造当前类型临时对象;最后总结二者区别,提醒开发中需注意其可能带来的麻烦。

采用C++进行程序开发的过程中,难免会遇到各种各样莫名其妙的问题,而有些问题只有了解了其用法和原理之后,才能避免在工作中犯错误。

本文将要讲解的C++两种隐式类型转换,如果不了解其用法,那么遇到问题的时候,可能就会陷入困境。

所以接下来就来讲解operator与构造函数的隐式类型转换,首先通过例子说明operator的隐式类型转换,再说明构造函数的隐式类型转换,最后再总结它们之间的区别。

922a608f1939cd90cc5050eed9b81d46.png

一、 operator隐式类型转换

operator除了操作符的重载之外,还有隐式类型转换的功能。operator隐式类型转换是指隐式将当前对象生成其他类型的对象。

为了说明operator的隐式类型转换,首先实现ObjectA对象, 形如operator int的声明即为operator的隐式类型,而转换的类型为整型int。

69cd022b0e8b922001987bba6d2cd09e.png

1、主程序输入如下代码段,先创建ObjectA类型的对象objA,然后将该对象变量objA与整型数字4相加。

5133b3ecbd8f986fb149d61c4bf12da9.png

2、从 调试运行输出的结果看,ObjA虽然不是int类型,但是与整数类型4进行相加的时候,会调用到operator int函数,该函数返回的结果是int类型

e0ffe1515933cbb431f88e1e0b4e7836.png

二、构造函数的隐式类型转换

构造函数的隐式类型转换,是用其他类型来构造当前类型的临时对象。

为了说明构造函数的隐式类型转换,需要实现ObjectB类,该类实现了一个无参数构造函数、一个参数类型为ObjectA的构造函数,一个析构函数和打印函数,注意入参类型是ObjectB。

be79b6f28bcdc08b97ab541bb03bb2a9.png

1、主程序中输入如下代码段, 创建ObjectA类型的对象objA,主要用于说明后面构造函数隐式类型的转换,接着创建ObjectB类型的对象objB,最后调用该对象的打印函数print,但是入参类型为ObjectA。

587c6e5aa5d2d0d474f23d767c2c0c76.png

2、 从调试运行输出结果看,print函数声明的入参类型是ObjectB, 但是传递的类型是ObjectA,但是由于ObjectB有单一形参类型为ObjectA的构造函数,程序会隐式的将objA转换为ObjectB(objA)

d04bf0826324f0169b8bbf43a3e36755.png

3、 如果想禁用构造函数的隐式类型转换,那么构造函数前添加explicit 即可,例如:

aea8b7b482ad84c74cb969d03227c534.png

三、总结

本文主要通过例子讲解了opertor隐式类型与构造函数隐式类型的用法,C++提供了这样的机制,必然有其合理性,正所谓存在即合理,但是,开发过程中,如果不注意的话,也会带来很多不必要的麻烦,因此,对其有一个整体的概念的理解,能够在开发过程中,给予一个警惕的作用。最后再来梳理下两种隐式类型转换的区别。

  1. operator的隐式类型转换是将当前对象生成其他类型的对象。
  2. 构造函数的隐式类型转换,是用其他类型来构造当前类型的临时对象
  3. operator的隐式类型转换与构造函数的隐式类型转换是相反的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值