C++转换函数(conversion function)详解—HJ-record07

目录

conversion function(转换函数)

“转出去”

出现一个小bug 

“转进来”


conversion function(转换函数)

假设现在设计一个类A(class A),用其创建出来的一个对象,那这个对象可不可以被转为另外一种类型呢?(转出去)或者是,另外一种其他类定义的对象,可不可以转换为类A呢?(转进来),这些就是转换函数所针对的场景。

“转出去”

下面是一个用来表示分数的类:

class Fraction
{
public:
	Fraction(int num, int den = 1)
		:m_numerator(num), m_denominator(den) { }
	operator double() const {
		return (double)(m_numerator / m_denominator);
	}
private:
	int m_numerator;//分子
	int m_denominator;//分母
};

其中,

	operator double() const {
		return (double)(m_numerator / m_denominator);
	}
  1. 这个就是转换函数,这个函数很特别,以"operator"开头,希望将这个函数处理的变量转换为那个类型,就把具体的类型给接在后面,比如,这个场景下希望将处理的数据处理成double类型,就写成了"operator double() const"。
  2. 保证Fraction类所创建的对象,要可以被转为double类型, 编译器在任何需要将Fraction所创建的对象需要变成double类型的时候,都可以来调用这个函数。
  3. 另外转换函数不可以有参数。
  4. 转换函数不写返回类型(return type),这是因为,转换函数在函数名的时候就已经写了,要转换为double类型,如果前面再要求写清楚转换函数的返回类型,万一写错了怎么办呢?所以干脆,为了稳定性其间,对于转换函数,返回类型就不用再写了!
  5. 转换函数要用"const"关键字修饰,因为转换函数通常只是再改变数据的类型,而不涉及到改变数据的值,所以,在使用转换函数的时候通常加一个"const"将函数设计出只读模式(该加就加,不该加别加),就可以进一步提高代码的规范程度和降低出错的风险。

下面进行调用一下:

int main()
{
	Fraction f(3, 5);
	double d = 4 + f;//调用operator double()将f转换为0.6
	std::cout << "d = " << d << std::endl;
	return 0;
}

f对象输入的数据都是int类型的,第二行默认的是执行double类型来完成的,但是,如果f不能通过转换函数转换为double类型,第二条语句就会报错,否则,就不会报错,成功的将f的int值3/5,转换为0.6。然后,再进行加和,得到4.6。

那么运行结果显示:

我的天!竟然跟预想的不一样!经过反复的排查,发现问题出在了转换函数的返回值上:

    return (double)(m_numerator / m_denominator);

 这样定义的情况下就是上面的情况,当我把后面的小括号给去掉的时候,

    return (double) m_numerator / m_denominator;

 再执行,结果就变正常了:

出现一个小bug 

总结原因发现,这是出现问题的地方:

    return (double)(m_numerator / m_denominator);

如果声明成这样 (double) (m_numerator / m_denominator) 会执行int类型的除法运算

所以要先将两个int型参数的一个转换成double型参数即可

故,当把后面的括号给去掉后,做除的结果就不会被直接析构了,而是作为转换double的输入,进行执行,那么就正常出现结果了!

 

“转进来”

上面的是转出去,也可以转进来,比如想把目前的double类转为string类,然后,进行具体的设计,包括1.如何识别;2.如何转换。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值