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
- 04 C++中转换函数(Conversion Function)的用法(学自Boolean)
- 05 C++中智能指针point-like class和仿函数function-like的基本用法(学自Boolean)
- 09 C++Reference引用的用法(学自Boolean)
- 在LoadRunner中转换字符串大小写的C语言函数
- 30 hash function(学自Boolean)
- C++中转换函数
- 26 函数适配器binder2nd(学自Boolean)
- SQL中转换数据类型的 Cast和Convert的用法和区别 SQL Server 函数
- 06 C++中类、函数、成员模板基本用法(学自Boolean)
- 03 C++中复合、委托和继承的基本用法(学自Boolean)
- 25 仿函数与函数对象(学自Boolean)
- 【实用代码】C#中转换全半角字符的函数
- C#中转换函数Convert、Parse、TryParse、(int) 的区别
- C#中转换函数Convert、Parse、TryParse、(int) 的区别
- C#中转换函数Convert、Parse、TryParse、(int) 的区别
- 19 迭代器iterator的设计原则(学自Boolean)
- 20 容器vector的深度探索(学自Boolean)
- 24 迭代器分类对算法的影响(学自Boolean)
- 2017年11月6日训练日记
- Nginx 的软件负载均衡详解
- 文章标题
- nyoj 20 吝啬的国度
- GCC基础知识3
- 04 C++中转换函数(Conversion Function)的用法(学自Boolean)
- Tomcat是如何响应静态资源的?
- 深度学习_循环神经网络RNN与LSTM
- 在 CentOS 下安装使用 XWiki
- JSP页面的执行过程
- node中,已经在app中设置了跨域的问题,但是用jq的ajax请求时仍然报跨域错误
- Camera APP层分析之对camera framework层封装解析
- redis面试题总结
- 集合框架