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分

代码实现:

 1 #include <iostream> 
 2 using namespace std;
 3 
 4 class Money 
 5 {
 6 private:
 7     int yuan, jiao, fen;
 8     bool flag;            //标志位,0表示钱数为正,1表示钱数为负 -> 默认结果的钱数为正 
 9 public:
10     Money(); 
11     Money(int fg, int y=0, int j=0, int f=0): yuan(y), jiao(j), fen(f), flag(fg){}
12     friend Money operator+(Money a, Money b);    
13     friend Money operator-(Money a, Money b);
14     void display();
15    
16 };
17 
18 Money::Money()
19 {
20     flag = 0;
21     cout << "请输入元、角 分:" <<endl;
22     cin >> yuan >> jiao >> fen;
23 }
24 
25 void Money::display()
26 {
27     if(flag==1) cout << '-'; 
28     cout << yuan << "" << jiao << "" << fen << "" << endl;
29 }
30 
31 //请用友元函数重载加/减,并要在类Money中声明为友元 
32 //TODO重载加 类外定义Money类的+重载运算 
33 Money operator+(Money a, Money b)
34 {
35     Money temp(0);
36     // 将钱全部转化成分来计算 
37     int money_a = a.yuan*100 + a.jiao*10 + a.fen*1;
38     int money_b = b.yuan*100 + b.jiao*10 + b.fen*1;
39     int res = money_a + money_b;
40     // 因为是相加 故应该结果是正的 所以不用判断符号 但是相减时 结果可能为负 就要判断符号 
41     temp.yuan = res/100;
42     res = res % 100;
43     temp.jiao = res/10;
44     temp.fen = res % 10;
45     
46     // 返回结果对象 
47     return temp;
48 }   
49     
50 //TODO重载减 类外定义Money类的-重载运算 
51 Money operator-(Money a, Money b)
52 {
53     Money temp(0);
54     // 将钱全部转化成分来计算 
55     int money_a = a.yuan*100 + a.jiao*10 + a.fen*1;
56     int money_b = b.yuan*100 + b.jiao*10 + b.fen*1;
57     int res = money_a - money_b;
58     // 因为是相减时 结果可能为负 就要判断符号 
59     if(res < 0)
60     {
61         temp.flag = 1;
62         res = -res;
63     }    
64     temp.yuan = res/100;
65     res = res % 100;
66     temp.jiao = res/10;
67     temp.fen = res % 10;
68     
69     // 返回结果对象 
70     return temp;
71 }
72  
73 int main() 
74 {
75     Money m1, m2, m3(0), m4(0); //m3用来记录和,m4用来记录差 
76     
77     // +
78     m3=m1+m2;
79     cout<<"和:";
80     m3.display(); 
81     
82     // -
83     m4=m1-m2;
84     cout<<"差:";
85     m4.display();
86     
87     return 0;
88 }

2.日期类运算符重载

要求:

定义一个日期类Date,包含年、月、日三个数据成员
   友元函数重载自增运算符(++),实现日期的自增。运行结果如下
    例如:
    请输入年、月、日:
     2016 11 11
    今天是:2016-11-11
    明天是:2016-11-12
    请完成以下程序 ,并注意特殊情况,例
    输入的是2016-12-31日
    输出的是2017-1- 1日   

代码实现:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Date{
 5 private:
 6     int year;
 7     int month;
 8     int day;
 9 public:
10     Date();
11     Date operator++(int);        // 申明重载的操作符,这种方法是后缀++ 
12     /*
13     ++和--重载注意:  ++和--有前后缀之分,另外下面的int只是一个占位符用来提示编译器 
14     类名 operator++();       ++前缀    -> 调用方式: ++对象名    
15     类名 operator--();         --前缀  -> 调用方式: --对象名
16     类名 operator++(int);    ++后缀     -> 调用方式: 对象名++
17     类名 operator--(int);   --后缀  -> 调用方式: 对象名--
18     */ 
19     void display();
20 }; 
21 
22 // 判断是否是闰年 是闰年返回1 不是返回0 
23 int judge(int year)
24 {
25     if(year%4==0&&year%100!=0||year%400==0)
26         return 1;          //闰年 
27     return 0;              //非闰年 
28 }
29 
30 // 构造函数 
31 Date::Date()
32 {
33     cout<<"请输入年、月、日:
";
34     cin>>year>>month>>day;
35 }
36  
37 // 运算符重载 
38 Date Date::operator++(int)
39 {
40     // 数组存储一年12个月的天数,如果对象中的年份为闰年就将2月份的天数+1 
41     int month_days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
42     if(judge(year))
43     {
44         month_days[1]++;
45     }
46     
47     // 天数刚好是这个月的最后一天 就要判断月份是否是一年的最后一个月(12月)
48     // 如果是12月 那么说明这一天是这一年的最后一天 那么年份+1 月和天均置1
49     // 如果不是12月 那么就把月份+1,天置1 
50     if(day==month_days[month-1])
51     {
52         if(month==12) 
53         {
54             year++;
55             month=1;
56             day=1;
57         }
58         else
59         {
60             month++;
61             day=1;
62         }
63     }
64     // 天数不是这个月的最后一天 就直接把天数+1即可 
65     else
66     {
67         day++;
68     }
69     
70     // 返回计算后的对象 就是套路 凡是++和--运算符重载 都可以这样做
71     // 当然可以提前用一个temp保存*temp的值然后返回temp 也是同理 书上这两种方法都有 
72     return *this;
73 }
74 
75 void Date::display()
76 {
77     cout<<year<<"-"<<month<<"-"<<day<<endl;
78 }
79 
80 int main()
81 {
82     Date d1; 
83     cout<<"今天是:";
84     d1.display();
85     d1++;
86     cout<<"明天是:";
87     d1.display(); 
88 }
原文地址:https://www.cnblogs.com/wyb666/p/9178389.html