转换函数 和 explicit

在这里插入图片描述
此时就不需要重载全局操作符+。
首先是检查有没有全局重载对应的+,没有找到,再调用转换函数,如果没有则报错,有的调用其进行隐式转换。

转换函数语法
返回类型就是double,所以不用写。
所以转换函数不用写返回类型。
另外呢,一般都加const(建议加)。(当然不加也可以编译通过)

注:上图中的转换函数有问题,应该先将分子分母转成double再运算返回:

#include <iostream>
using  namespace std;

class Fraction{
public:
    Fraction(int m,int n):_m(m),_n(n){
    }
    operator double() const {
        return (double(_m)/double(_n));
    }
private:
    int _m;
    int _n;
};

int main() {
    Fraction a(3,5);
    double b=4+a;
    cout<<b<<endl;
    return 0;
}

形式:

operator 类型名() const{
	// 函数体
	return 对应的类型;
}

non_explicit-one-argument ctor

不写返回类型,const成员函数。
另外呢,下图这种构造函数称为:非- explicit -一个实参 的构造函数(有一个默认参数)
2 parameters(argument指的实参,parameter指的形参)
(Explicit 明确的)
在这里插入图片描述
有何特性?
在这里插入图片描述
这里没有定义转换函数。
首先找有没有+这个动作,没有严格的重载函数,所以做调用构造函数把4转成Fraction类型,再调用operator+

二者并存

在这里插入图片描述
编译器就不知道该怎么办呢。歧义。二者都可行,并且没有哪一种更好(优先级)。
1、先调用double把f转成double,加法结果为double,再把double转成Fraction、
2、或者 : 调用非explicit的一个实参的 构造函数 把4 转成Fraction,再调用operator+;

explicit

现在加上构造函数前加上explicit。那么(单个实参的)构造函数就不能用于把 单个实参 隐式转成
此Fraction类。
在这里插入图片描述
这时候就会报错,因为+重载时两边都是Fraction类对象,而构造函数explicit无法转换了。
注:此时d2是Fraction对象,而不是先前的double。

此时,先前的两种歧义行为:
1、先调用double把f转成double,加法结果为double,再调用 非explicit构造函数把double转成Fraction、
2、或者 : 调用非explicit的一个实参的 构造函数 把4 转成Fraction,再调用operator+;

由于构造函数是explicit,所以歧义1和2不能成立(因为都要调用非explicit构造函数)。

所以这个关键字,99%的情况下都是用在构造函数前面。用来避免隐式转换(可能与内部的转换函数发生歧义导致错误)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值