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类型。