2022-2-13 转换函数(conversion function) non-explicit-one argument ctor explicit-one argument ctor

学习时间及标题:

2022-2-13 转换函数(conversion function) non-explicit-one argument ctor explicit-one argument ctor

学习内容:

1.转换函数(conversion function):

在这里插入图片描述
这是一个将分数(Fraction)类型转化为double类型的例子。我们可以看出转换函数不需要指明返回值类型,因为operator后面就给出了要返回的类型。
当编译double d=4+f;一句时,编译器会做如下尝试:
1.有没有重载运算符+,其左右两边参数类型为double类型和Fraction类型,但这里没有。
2.然后编译器又想,那能否将Fraction类型转换为double类型,然后参与运算,发现有转换函数可以实现。

2.non-explicit-one argument ctor和 explicit-one argument ctor:

在这里插入图片描述
non-explicit-one argument ctor指的就是具有一个实参的构造函数且前面没有关键字explicit。反之explicit-one argument ctor指的就是有关键字explicit的具有一个实参的构造函数。
注意:实参(argument)和参数(parameter)是不同的,例如图中的Fraction类的构造函数就是有两个参数,但只有一个实参-num。
当编译Fraction d2=f+4;一句时,编译器会做如下尝试:
1.看看Fraction这个类里有没有运算符+,发现有,但是运算符+右边也得是Fraction。
2.然后编译器又想,那能否将4转换为Fraction类型,发现可以,然后就将4转换为Fraction类然后参与运算。
这里4转换为Fraction类型是通过隐式转换的方式进行的。
如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制

在这里插入图片描述
根据上图,我们可以知道当运算符+的重载和转换函数同时出现时,会报错。
当编译Fraction d2=f+4;一句时,让我们看看错误出在哪里:
当编译器看到这一句时,发现有两条路可以走,一条是将4转换为Franction类型参与运算,另一条是将f转换为double类型参与运算。于是编译器就不知道怎么办了。

在这里插入图片描述
而当我们像上图一样,在构造函数前加关键字explicit后,仍然报错。
当编译Fraction d2=f+4;一句时,让我们看看错误出在哪里:
当构造函数前加上关键字explicit后,编译器就无法将4通过隐式转换将其转换为Fraction。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值