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

来源:互联网 发布:js数字转为汉字 编辑:程序博客网 时间:2024/06/14 06:52

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.6r2: 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; //【错误】ambiguousFraction f3 = 4.0 + f1;  double d = 4.0 + f3;cout << d << endl;return 0;}
注意点:

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

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

阅读全文
0 0
原创粉丝点击