运算符重载的例子
2015-12-24 01:08
239 查看
/// @file ClassroomExamples.cpp /// @brief 2015-1223课堂笔记的验证代码 #include <iostream> #include <limits> #include "RMB.h" using namespace std; void clear_cin(); void fnTest_Operator_overloading(); int main(int argc, char** argv, char** envp) { fnTest_Operator_overloading(); cout << "END, press any key to quit" << endl; clear_cin(); getchar(); return 0; } void fnTest_Operator_overloading() { CRMB rmb1(10); CRMB rmb2(11); CRMB rmb3(2.62); CRMB* pRmb = NULL; pRmb = new CRMB(); delete pRmb; cout << rmb3 << endl; rmb3 = (double)1 + rmb1; rmb3 = (double)12 - rmb1; rmb3 = rmb1 + (double)1; rmb3 = rmb1 - 2.1; rmb3 = rmb1 + rmb2; rmb3 = rmb1 - rmb2; rmb2 = rmb1; cout << (rmb1 == rmb2) << endl; cout << (rmb1 > rmb2) << endl; cout << (rmb1 >= rmb2) << endl; cout << (rmb1 < rmb2) << endl; cout << (rmb1 <= rmb2) << endl; rmb1 += 10; rmb1 -= 2; cout << (++rmb1).getRmb() << endl; cout << (--rmb1).getRmb() << endl; cout << (rmb1--).getRmb() << endl; cout << (rmb1++).getRmb() << endl; cout << "rmb1.getRmb() = " << rmb1.getRmb() << endl; } void clear_cin() { cin.clear(); cin.sync(); }
// RMB.h: interface for the CRMB class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_RMB_H__E46A1710_9261_4FD9_999D_9865D891E42C__INCLUDED_) #define AFX_RMB_H__E46A1710_9261_4FD9_999D_9865D891E42C__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include <string> #include <iostream> #include <iomanip> #include <stddef.h> using namespace std; class CRMB { /// 友元函数(不能再类内实现的功能) friend CRMB operator + (double dblAddTo, const CRMB& right); friend ostream& operator<< (ostream& cout, CRMB& right) { cout << "right.getAddr() = 0X" << hex << setfill('0') << setw(8) << setiosflags(ios::uppercase) << right.getAddr() << endl; cout << "right.getRmb() = " << right.getRmb() << endl; return cout; } /// 构造,析构,拷贝构造函数 public: explicit CRMB(double dblRmb = 0); ///< 不允许隐式转换 CRMB(const CRMB& src); virtual ~CRMB(); /// 转换运算符重载 /// 如果不定义"转换运算符重载", /// 就走构造函数了 explicit CRMB(double dblRmb = 0) /** 应用场合 rmb3 = (double)1 + rmb1; rmb3 = (double)12 - rmb1; rmb3 = rmb1 + (double)1; */ operator double () { return m_dblRmb; } /// 运算符重载 public: inline CRMB& operator = (const CRMB& src) { cpy(&src); return *this; } //友元全局函数重载, 类内实现 friend CRMB operator + (double dblAddTo, const CRMB& right) { return CRMB(dblAddTo + right.getRmb()); } /// 只拦截 new CRMB 的操作 static void* operator new(size_t nSize) { void* pNewPt = NULL; pNewPt = ::operator new(nSize); if (NULL != pNewPt) { cout << "new CRMB = 0X" << hex << setfill('0') << setw(8) << setiosflags(ios::uppercase) << pNewPt << " nSize = " << nSize << endl; } return pNewPt; } /// 只拦截 delete CRMB 的操作 static void operator delete(void* pRmb) { if (NULL != pRmb) { cout << "delete CRMB = 0X" << hex << setfill('0') << setw(8) << setiosflags(ios::uppercase) << pRmb << endl; ::operator delete(pRmb); } } CRMB operator + (double dblAddTo) { return CRMB(getRmb() + dblAddTo); } CRMB operator + (const CRMB src) { return CRMB(getRmb() + src.getRmb()); } CRMB operator - (double dblSubTo) { return CRMB(getRmb() - dblSubTo); } CRMB operator - (const CRMB src) { return CRMB(getRmb() - src.getRmb()); } inline void operator += (double dbl) {m_dblRmb += dbl;} inline void operator -= (double dbl) {m_dblRmb -= dbl;} inline CRMB& operator ++() ///< 前++ { ++m_dblRmb; return *this; } inline CRMB operator ++(int) ///< 后++ { return m_dblRmb++; } inline CRMB& operator --() ///< 前-- { --m_dblRmb; return *this; } inline CRMB operator --(int) ///< 后-- { return m_dblRmb--; } inline bool operator == (const CRMB& right) const { return isEqual(getRmb(), right.getRmb()); } inline bool operator > (const CRMB& right) const { return (getRmb() > right.getRmb()); } inline bool operator >= (const CRMB& right) const { return (getRmb() >= right.getRmb()); } inline bool operator < (const CRMB& right) const { return (getRmb() < right.getRmb()); } inline bool operator <= (const CRMB& right) const { return (getRmb() <= right.getRmb()); } /// 成员函数 public: inline double getRmb() const {return m_dblRmb;} inline int getAddr() {return (int)this;} private: void cpy(const CRMB* pSrc); bool isEqual(double dblLeft, double dblRight) const; /// 成员变量 private: double m_dblRmb; ///< 钱数 }; //友元全局函数重载, 类外实现 /// 实现在RMB.cpp CRMB operator - (double dblAddTo, const CRMB& right); #endif // !defined(AFX_RMB_H__E46A1710_9261_4FD9_999D_9865D891E42C__INCLUDED_)
// RMB.cpp: implementation of the CRMB class. // ////////////////////////////////////////////////////////////////////// #include "RMB.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CRMB::CRMB(double dblRmb /*= 0*/) :m_dblRmb(dblRmb) { } CRMB::~CRMB() { } CRMB::CRMB(const CRMB& src) { cpy(&src); } void CRMB::cpy(const CRMB* pSrc) { if (this == pSrc) { return; } m_dblRmb = pSrc->m_dblRmb; } bool CRMB::isEqual(double dblLeft, double dblRight) const { double dblDifference = dblLeft - dblRight; const double dblPrecision = 0.00000001; return ((dblDifference >= -dblPrecision) && (dblDifference <= dblPrecision)); } CRMB operator - (double dblAddTo, const CRMB& right) { return CRMB(dblAddTo - right.getRmb()); }
相关文章推荐
- Eclipse导入Maven工程报异常
- LNMP nginx配置和 php-fpm通道详解
- Maven settings 开源中国 镜像并下载本地仓库
- [ISUX译]iOS 9人机界面指南(一):UI设计基础
- HTTP协议
- 日期的格式,你用得对吗?
- ZOJ 1049 I Think I Need a Houseboat
- Result Maps collection already contains value for xxxMapper.BaseResultMap错误解决办法
- win7配置maven环境变量
- Block的简介和简单原理
- 网络编程:Reactor与Proactor的概念
- 不好好说话版原理(二)ORACLE数据库的连接
- Block在ARC和非ARC中的使用
- 删除linux系统服务
- android的线性布局
- echarts中显示效果option中必有的属性
- ASP.NET中最保险最环保的返回404的方法
- Kafka入门
- iis7+ 禁止IP访问设置方法
- 手机刷机软件与ROM的盈利模式分析