C++中的运算符重载练习题
1.RMB类
要求:
定义一个RMB类 Money,包含元、角、分三个数据成员,友元函数重载运算符‘+’(加)
和 ‘-’(减),实现货币的加减运算
例如:
请输入元、角 分:
2 3 4
请输入元、角 分:
3 7 3
和:6元0角7分
差:-1元3角9分
又例如:
请输入元、角 分:
2 3 4
请输入元、角 分:
3 0 0
和:4元6角0分
差:-0元6角6分
代码实现:
#include <iostream>
using namespace std; class Money
{
private:
int yuan, jiao, fen;
bool flag; //标志位,0表示钱数为正,1表示钱数为负 -> 默认结果的钱数为正
public:
Money();
Money(int fg, int y=, int j=, int f=): yuan(y), jiao(j), fen(f), flag(fg){}
friend Money operator+(Money a, Money b);
friend Money operator-(Money a, Money b);
void display(); }; Money::Money()
{
flag = ;
cout << "请输入元、角 分:" <<endl;
cin >> yuan >> jiao >> fen;
} void Money::display()
{
if(flag==) cout << '-';
cout << yuan << "元" << jiao << "角" << fen << "分" << endl;
} //请用友元函数重载加/减,并要在类Money中声明为友元
//TODO重载加 类外定义Money类的+重载运算
Money operator+(Money a, Money b)
{
Money temp();
// 将钱全部转化成分来计算
int money_a = a.yuan* + a.jiao* + a.fen*;
int money_b = b.yuan* + b.jiao* + b.fen*;
int res = money_a + money_b;
// 因为是相加 故应该结果是正的 所以不用判断符号 但是相减时 结果可能为负 就要判断符号
temp.yuan = res/;
res = res % ;
temp.jiao = res/;
temp.fen = res % ; // 返回结果对象
return temp;
} //TODO重载减 类外定义Money类的-重载运算
Money operator-(Money a, Money b)
{
Money temp();
// 将钱全部转化成分来计算
int money_a = a.yuan* + a.jiao* + a.fen*;
int money_b = b.yuan* + b.jiao* + b.fen*;
int res = money_a - money_b;
// 因为是相减时 结果可能为负 就要判断符号
if(res < )
{
temp.flag = ;
res = -res;
}
temp.yuan = res/;
res = res % ;
temp.jiao = res/;
temp.fen = res % ; // 返回结果对象
return temp;
} int main()
{
Money m1, m2, m3(), m4(); //m3用来记录和,m4用来记录差 // +
m3=m1+m2;
cout<<"和:";
m3.display(); // -
m4=m1-m2;
cout<<"差:";
m4.display(); return ;
}
2.日期类运算符重载
要求:
定义一个日期类Date,包含年、月、日三个数据成员
友元函数重载自增运算符(++),实现日期的自增。运行结果如下
例如:
请输入年、月、日:
2016 11 11
今天是:2016-11-11
明天是:2016-11-12
请完成以下程序 ,并注意特殊情况,例
输入的是2016-12-31日
输出的是2017-1- 1日
代码实现:
#include <iostream>
using namespace std; class Date{
private:
int year;
int month;
int day;
public:
Date();
Date operator++(int); // 申明重载的操作符,这种方法是后缀++
/*
++和--重载注意: ++和--有前后缀之分,另外下面的int只是一个占位符用来提示编译器
类名 operator++(); ++前缀 -> 调用方式: ++对象名
类名 operator--(); --前缀 -> 调用方式: --对象名
类名 operator++(int); ++后缀 -> 调用方式: 对象名++
类名 operator--(int); --后缀 -> 调用方式: 对象名--
*/
void display();
}; // 判断是否是闰年 是闰年返回1 不是返回0
int judge(int year)
{
if(year%==&&year%!=||year%==)
return ; //闰年
return ; //非闰年
} // 构造函数
Date::Date()
{
cout<<"请输入年、月、日:\n";
cin>>year>>month>>day;
} // 运算符重载
Date Date::operator++(int)
{
// 数组存储一年12个月的天数,如果对象中的年份为闰年就将2月份的天数+1
int month_days[]={,,,,,,,,,,,};
if(judge(year))
{
month_days[]++;
} // 天数刚好是这个月的最后一天 就要判断月份是否是一年的最后一个月(12月)
// 如果是12月 那么说明这一天是这一年的最后一天 那么年份+1 月和天均置1
// 如果不是12月 那么就把月份+1,天置1
if(day==month_days[month-])
{
if(month==)
{
year++;
month=;
day=;
}
else
{
month++;
day=;
}
}
// 天数不是这个月的最后一天 就直接把天数+1即可
else
{
day++;
} // 返回计算后的对象 就是套路 凡是++和--运算符重载 都可以这样做
// 当然可以提前用一个temp保存*temp的值然后返回temp 也是同理 书上这两种方法都有
return *this;
} void Date::display()
{
cout<<year<<"-"<<month<<"-"<<day<<endl;
} int main()
{
Date d1;
cout<<"今天是:";
d1.display();
d1++;
cout<<"明天是:";
d1.display();
}
C++中的运算符重载练习题的更多相关文章
- C++中的运算符重载注意事项
1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑
- c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...
- C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++中的运算符重载
首先思考以下几个问题: 1.什么是运算符重载? 2.为什么要重载运算符,它有什么用? 3.可以重载哪些运算符? 4.重载运算符有哪些规则? 一.基本概念 我们在程序中使用各种操作符,比如加(+).赋值 ...
- 在Lua中进行运算符重载
在C++里面运算符是可以重载的,这一点也是C++比较方便的一个地方.在Lua中其实也是可以模拟出运算符的重载的. 在Lua中table中元素的运算都是和一个叫做元表有关的,在一个table型的变量上都 ...
- Python 中的运算符重载
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 一种运算符对于不同类型的对象,有不同的使用方式.例如, + 用于整型对象,表示两个数相加:用于字符串 ...
随机推荐
- Hibernate Validator参数校验
日常开发中经常会遇到需要参数校验的情况,比如某个字段不能为空.长度不能超过5等都属于参数校验的范围.对于简单的参数校验通过写几个if-else判断语句就搞定,但是对于复杂的多个参数校验的情况,就不是那 ...
- Android 你可能忽略的提高敲代码效率的方式
Android 你可能忽略的提高敲代码效率的方式
- 在Fragment中加一个嵌套了ListView的ScrollView(一)
首先介绍一下这个程序的功能: 1.顶部有两个可以切换Fragment的Button 2.在其中一个Fragment中里有个ScrollView,ScrollView中有ViewFlipper,List ...
- Postfix常用命令和邮件队列管理(queue)
本文主要介绍一下postfix的常用命令及邮件队列的管理: Postfix有以下四种邮件队列,均由管理队列的进程统一进行管理: maildrop:本地邮件放置在maildrop中,同时也被拷贝到inc ...
- DevExpress GridControl 显示外部图片
如果数据源中只包含图片的链接,如何在DevExpress GridControl的一列中显示外部图片? 要实现该功能,可通过非绑定列的方式来实现.具体实现方法如下: 1. 创建了一个非绑定列并设 ...
- ubuntu安装依赖:0.8.1-1ubuntu4.4 正要被安装以及vm nested解决方法
刚才在ubuntu10.04虚拟机上安装kvm,提示0.8.1-1ubuntu4.4 正要被安装,查了一下,有一种解决方法: 进入“系统->系统管理->更新管理器->设置”,在弹出的 ...
- erl_0021 erlang和java的内存模型比较(引用)
原文 http://deepinmind.iteye.com/blog/2030390 我读到一篇相当相当有趣的关于Erlang VM内存管理策略的文章.它是Jesper Wilhelmsson写的 ...
- HDU - 5887:Herbs Gathering (map优化超大背包)
Collecting one's own plants for use as herbal medicines is perhaps one of the most self-empowering t ...
- Servlet实现数字字母验证码图片(二)
Servlet实现数字字母验证码图片(二): 生成验证码图片主要用到了一个BufferedImage类,如下:
- 剑指offer第五章
剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...