实现一个RMB的强货币类型

#ifndef RMB_H_
#define RMB_H_

typedef double Yuan;
typedef unsigned long Cent;

class RMB {
public:
	RMB();
	RMB(Cent cent);
	RMB(Yuan yuan);
	RMB(RMB& that);
	~RMB();

	const char* toString();

	Yuan 	GetYuan()const;
	Cent	GetCent()const;

	RMB& 	operator=(RMB& that);
	RMB& 	operator=(Cent cent);
	RMB& 	operator=(Yuan yuan);

	bool 	operator==(RMB& that)const;
	bool 	operator> (RMB& that)const;
	bool 	operator< (RMB& that)const;
	bool 	operator>=(RMB& that)const;
	bool 	operator<=(RMB& that)const;
	bool 	operator!=(RMB& that)const;

	RMB& 	operator++();
	RMB 	operator++(int);

	RMB& 	operator--();
	RMB 	operator--(int);

	RMB&	operator+=(RMB& that);
	RMB&	operator-=(RMB& that);

private:
	Cent m_Base;
};

#endif /* RMB_H_ */

实现

#include "RMB.h"

#include <stdio.h> //for sprintf

RMB::RMB()
	:m_Base(0)
{

}

RMB::RMB(Cent cent)
{
	m_Base = cent;
}

RMB::RMB(Yuan yuan)
{
	m_Base = yuan*100;
}

RMB::RMB(RMB& that)
{
	this->m_Base = that.m_Base;
}

RMB::~RMB()
{

}

Yuan
RMB::GetYuan()const
{
	return m_Base*0.01;
}

Cent
RMB::GetCent()const
{
	return m_Base;
}

const char*
RMB::toString()
{
	static char str[256]={0};
	sprintf(str,"%f yuan(Cent:%lu)\n",m_Base*0.01,m_Base);
	return str;
}

RMB&
RMB::operator=(RMB& that)
{
	if(this != &that)
	{
		this->m_Base = that.m_Base;
	}
	return *this;
}

RMB&
RMB::operator=(Cent cent)
{
	this->m_Base = cent;
	return *this;
}

RMB&
RMB::operator=(Yuan yuan)
{
	this->m_Base = yuan*100;
	return *this;
}

bool
RMB::operator==(RMB& that)const
{
	return this->m_Base == that.m_Base;
}

bool
RMB::operator> (RMB& that)const
{
	return this->m_Base > that.m_Base;
}

bool
RMB::operator< (RMB& that)const
{
	return this->m_Base < that.m_Base;
}

bool
RMB::operator>=(RMB& that)const
{
	return *this > that || * this == that;
}

bool
RMB::operator<=(RMB& that)const
{
	return *this < that || * this == that;
}

bool
RMB::operator!=(RMB& that)const
{
	return ! (*this==that);
}

RMB&
RMB::operator++()
{
	++this->m_Base;
	return *this;
}

RMB
RMB::operator++(int)
{
	RMB tmp(*this);
	++(*this);
	return tmp;
}

RMB&
RMB::operator--()
{
	--this->m_Base;
	return *this;
}

RMB
RMB::operator--(int)
{
	RMB tmp(*this);
	--(*this);
	return tmp;
}

RMB&
RMB::operator+=(RMB& that)
{
	this->m_Base+=that.m_Base;
	return *this;
}

RMB&
RMB::operator-=(RMB& that)
{
	this->m_Base-=that.m_Base;
	return *this;
}

测试代码

#include <iostream>
#include "RMB.h"

using namespace std;

int main()
{
	RMB m;
	cout<< m.toString() <<endl;
	++m;

	RMB m1(m);//拷贝构造
	cout<< m1.toString() <<endl;

	RMB m2 = m1;//拷贝构造
	cout<< m2.toString() <<endl;

	//RMB n(10);无法编译通过 必须指定类型
	RMB n( static_cast<Yuan>(10) );
	cout<< n.toString() <<endl;

	RMB n1( static_cast<Cent>(10) );
	cout<< n1.toString() <<endl;

	n1=n;//拷贝赋值
	cout<< n1.toString() <<endl;

	if(m==n)
		cout << "m==n" <<endl;
	if(m!=n)
		cout << "m!=n" <<endl;
	if(m>n)
		cout << "m>n" <<endl;
	if(m<n)
		cout << "m<n" <<endl;
	if(m>=n)
		cout << "m>=n" <<endl;
	if(m<=n)
		cout << "m<=n" <<endl;

	//m = 200;无法编译通过 必须指定类型
	m = static_cast<Yuan>(200);
	cout<< m.toString() <<endl;

	n = static_cast<Cent>(200);
	cout<< n.toString() <<endl;

	return 0;
}

运行结果

0.000000 yuan(Cent:0)

0.010000 yuan(Cent:1)

0.010000 yuan(Cent:1)

10.000000 yuan(Cent:1000)

0.100000 yuan(Cent:10)

10.000000 yuan(Cent:1000)

m!=n

m<n

m<=n

200.000000 yuan(Cent:20000)

2.000000 yuan(Cent:200)

实现一个RMB的强货币类型,布布扣,bubuko.com

时间: 2024-10-22 16:20:21

实现一个RMB的强货币类型的相关文章

判断一个变量是数组类型的方法

在很多时候,我们都需要对一个变量进行数组类型的判断(借鉴) 学过js就应该知道typeof运算符返回字符串,该字符串代表操作数的类型(即返回数据类型)这是最常用的. 下面多种实现方式: JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Array的对象就不起作用了. alert(typeof null); // "object" alert(ty

C#调用Excel报 error CS1969: 找不到编译动态表达式所需的一个或多个类型。是否缺少引用?

转自[http://blog.csdn.net/bodybo/article/details/43191319] 程序需要读取Exel文件,有如下代码段 [csharp] view plaincopy object oMissing = System.Reflection.Missing.Value; Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Applicati

More Effective C++ 条款31 让函数根据一个以上的对象类型来决定如何虚化

1. 假设要编写一个发生在太空的游戏,其中有飞船(spaceship),太空站(space station)和小行星(ssteroid),使它们继承自一个抽象基类GameObject,整个继承体系像这样: class GameObject { ... }; class SpaceShip: public GameObject { ... }; class SpaceStation: public GameObject { ... }; class Asteroid: public GameObj

Javascript如何判断一个变量是数字类型?

isNaN()不能判断一个变量是否为数字类型,isNaN(123)值为false,isNaN('123')值也为false.isNaN() 的实际作用跟它的名字isNaN并不一致,isNaN(NaN)值为true,isNaN(Number("xyz"))值为true,isNaN("abc")值为true,isNaN(123/0)值为false,所以它实际是将不能转换成number类型的其他类型及其自身NaN都判断为true,而除了其自身NaN外所有的number类型

C++ 指针(不论什么一个指针本身的类型都是unsigned long int型)

1.指针数组: 即 数组的元素是指针型; 例:int*pa[2]; 明明是一维的指针数组.竟当作二维数组用. [cpp] view plain copy //利用指针数组存放单位矩阵 #include <iostream> using namespace std; void main() { int line1[]={1,0,0}; //声明数组,矩阵的第一行 int line2[]={0,1,0}; //声明数组,矩阵的第二行 int line3[]={0,0,1}; //声明数组.矩阵的第

python基础===isinstance() 函数,判断一个对象是否是一个已知的类型

isinstance(object, classinfo) object -- 实例对象. classinfo -- 可以是直接或间接类名.基本类型或者有它们组成的元组. >>>a = 2 >>> isinstance (a,int) True >>> isinstance (a,str) False >>> isinstance (a,(str,int,list)) # 是元组中的一个返回 True True type() 与 is

表示一个文件的 File 类型

从本篇文章开始,我们将开启对 Java IO 系统的学习,本质上就是对文件的读写操作,听上去简单,其实并不容易.Java 的 IO 系统一直在完善和改进,设计了大量的类,也只有理解了这些类型被设计出来的意义以及各自的应用场景,才能提升文件 IO 的理解. 那么,第一步就是要解决如何表示一个文件的问题,Java 世界中「万物皆对象」,如何将一个实际磁盘文件或目录对应到一个 Java 对象则是我们首要的问题. Java 中使用 File 来抽象一个文件,无论是普通文件或是目录,都可对应于一个 Fil

关于Js(六) 如何判断一个变量是Array类型?如何判断一个变量是Number类型?(都不止一种)

Number 这种类型用来表示整数和浮点数值.typeof 操作符可以判断number的类型. 还有一种特殊的数值,即NaN(非数值 Not a Number),这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了).例如,在其他编程语言中,任何数值除以0都会导致错误,从而停止代码执行.但在JavaScript中,任何数值除以0会返回NaN,因此不会影响其他代码的执行. NaN本身有两个非同寻常的特点.首先,任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个

一个极简易 int 类型哈希表的实现

看了算法导论的影印版的哈希表时,开始还不太明白, 想了下后觉得似乎哈希表就是数组和链表的组合, 于是根据这个思路实现了一个最简易的哈希表. 这个其实我还是不太满意, 可能在以后会更新, 因为我觉得不满足 DRY 原则. class HashTable { private: const size_t initSize = 13; const int32_t hashNum = 13; vector<list<int32_t>> hashTable; int32_t Hash (con