6 实例——MyTime的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
//------mytime.h
#ifndef MYTIME_H
#define MYTIME_H
#include <iostream>

using namespace std;

class Time
{
//----------私有成员,类中的成员默认是私有的
private:
int hours;
int mintues;

//----------共有成员
public:
Time(); //默认构造函数
Time(int h, int m = 0); //显式构造函数
Time(const Time &); //拷贝构造函数
~Time(); //析构函数
void AddMin(int m);
void AddHour(int h);

void reset(int h = 0, int m = 0);

//------展示函数show()
void Time::show() const
{
cout << "hours:" << hours << " " << "mintues:" << mintues << " ";
}



Time operator+(const Time &t) const; //运算符重载

Time operator-(const Time &t) const;
Time operator*(double n) const;
friend Time operator*(double n, const Time &t) //友元;
{
return t*n; //在这里又调用了重载运算符 operator*(double n) const;
} //内联形式的定义;



friend ostream & operator<<(ostream &os, const Time &t); //一个双目运算符在重载时,如果是以友元的形式声明的,那么他有两个形参;如果是类的成员函数,那么他只有一个形参;

};


//-------时间重置,内联函数
inline void Time::reset(int h, int m)
{
hours = h;
mintues = m;
}

#endif


//--mytime.cpp

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

using namespace std;

//-------默认构造函数
Time::Time()
{
hours = mintues = 0;
cout << "调用默认构造函数" << endl;
}

//------显式的构造函数
Time::Time(int h, int m) :hours(h), mintues(m)
{
cout << "调用显式构造函数" << endl;
}

//------拷贝构造函数
Time::Time(const Time &t)
{
hours = t.hours;
mintues = t.mintues;
cout << "调用拷贝构造函数" << endl;
}

//------析构函数
Time::~Time()
{
cout << "调用了析构函数" << endl;
}

//-------小时相加
void Time::AddHour(int h)
{
hours += h;
}

//------分钟相加
void Time::AddMin(int m)
{
mintues += m;
hours += mintues / 60;
mintues %= 60;
}


//------重载+号
Time Time::operator+(const Time &t) const
{
Time sum;
sum.mintues = mintues + t.mintues;
sum.hours = hours + t.hours + sum.mintues / 60;
sum.mintues = sum.mintues % 60;
return sum;
}

//------重载-号
Time Time::operator-(const Time &t) const
{
Time diff;

int time1 = hours * 60 + mintues;
int time2 = t.hours * 60 + t.mintues;

diff.hours = (time1 - time2) / 60;
diff.mintues = (time1 - time2) % 60;

return diff;
}

//-------重载乘号
Time Time::operator*(double n) const
{
Time result;
long totalMintues = n*hours * 60 + n*mintues;

result.hours = totalMintues / 60;
result.mintues = totalMintues % 60;

return result;
}



//-------友元输出操作符
ostream & operator<<(ostream &os, const Time &t) //友元在类外定义的时候,不需要添加friend;
{
os << "hours:" << t.hours << " " << "mintues:" << t.mintues << " ";
return os;
}

//-----------------------
//main.cpp
//不用先生
//------------------------
#include <iostream>
#include "mytime.h"

using namespace std;


int main()
{

{
Time eat_breakfast(0, 45);
Time eat_lunch(1, 0);
Time eat_dinner(1, 30);



Time swiming(0, 45); //非const对象,既可以调用const成员函数,也可以调用非const成员。
const Time study(8, 5); //const对象只能调用const成员函数。


// study_cut_swim;
Time study_cut_swim = study - swiming; //调用运算符重载后的Time类的减号;


Time Eat_time_day = eat_breakfast + eat_dinner + eat_lunch; //调用了重载以后的加法;

cout << "学习比游泳多花" << study_cut_swim << endl; //调用友元输出运算符<<
cout << "每周吃饭所花费的时间为" << (7 * Eat_time_day) << endl; //调用了友元乘法以及输出运算符;
}



system("pause");
return 0;
}