04 C++中转换函数(Conversion Function)的用法

1、引言

本篇通过分数类Fraction的设计介绍C++类设计中,转换函数和non-explict-one-argument ctor的用法。

2、转换函数(将类对象类型转换为其它类型)

1)头文件

#ifndef FRACTION_H_
#define FRACTION_H_

class Fraction //分数
{
public:
	Fraction(int num, int den = 1) 
		:m_numerator(num), m_denominator(den){ }
	operator double() const {
		//return (double)(m_numerator / (m_denominator * 1.0)); //程序运行成功
		return m_numerator / ((double)m_denominator);  //程序运行成功
	}
private:
	int m_numerator; //分子
	int m_denominator; //分母
};
#endif

注意点:

a、构造函数是以一个实参和两个形参的形式构成;

b、使用operator double() const {...}的格式可实现将Fraction对象转换为double值,同理也可以转换为想要的类型,具体在该函数中实现;

2)主程序

#include "stdafx.h"
#include <iostream>
#include "Fraction.h"

int _tmain(int argc, _TCHAR* argv[])
{
	using std::cout;

	Fraction f(3, 5);
	double result = 3.0 + f;
	cout << "result: " << result << std::endl;

	Fraction f2(4);
	double r2 = 3.0 + f2;
	cout << "r2: " << r2 << std::endl;
	return 0;
}
/*运行结果:
	result: 3.6
	r2: 7
*/
注意点:

a、主程序中Fraction对象 f 和 f2 可以通过头文件中定义的函数转换为double类型值参与运算;

3、函数转换(将其它类型转换为类对象类型)

1)头文件

#ifndef FRACTION_H_
#define FRACTION_H_

class Fraction
{
public:
	//explicit Fraction(int num, int den = 1)
	//	:m_numerator(num), m_denominator(den){ } //若使用explicit,则其它对象类型不能转换为Fraction类型
	Fraction(int num, int den = 1)
		:m_numerator(num), m_denominator(den){ }
	operator double() const {
		return m_numerator / ((double)m_denominator);  //程序运行成功
	}
	Fraction operator + (const Fraction& f){
		return Fraction(m_numerator / (double)m_denominator + f.m_numerator / (double)f.m_denominator);
	}
private:
	int m_numerator; //分子
	int m_denominator; //分母
};
#endif

注意点:

a、第7行被注释的构造函数使用explicit关键字,若使用,则该构造函数只能用于构造对象,即其它值对象类型不能自动转换为Fraction类型;

b、头文件第14行增加了操作符重载 +,实现两个分数的相加;

2)主程序

#include "stdafx.h"
#include <iostream>
#include "Fraction2.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	Fraction f1(3, 5);
	//Fraction f2 = f1 + 4.0; //【错误】ambiguous
	Fraction f3 = 4.0 + f1;  
	double d = 4.0 + f3;
	cout << d << endl;
	return 0;
}
注意点:

a、第9行被注释代码会报错,因为该操作会调用重载操作符+,而头文件中同时定义了两种转换方法,编译器不知道f1与4.0的类型转换方式;

b、第10行能通过编译是因为该操作没有调用重载操作符+,可将该操作分为两步:第一步与1中类似实现数值加运算,第二步将计算结果转换为Fraction类型。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值