自增运算符++与自减运算符--运算逻辑大同小异,这里主要分析++运算符,--运算符后面有具体代码实现!
一 分析
1.需要实现单目运算符++的重载则要分别定义两个函数实现重载!
前置++与后置++函数的实现,前置++会改变表达式的值,例如++a,表达式++a的值会+1,
但是后置++,例如a++,只会使a的值+1,表达式a++的值还是原来a的值。
2.需要实现时钟类的自增运算需要注意运算逻辑,具体在第二部分有详细说明。
3.重载为非成员函数需要,将原函数定义为友元函数以获得时钟类私有成员的访问权限!
二 注意事项
1.运算符++为单目运算符,重载为非成员函数格式如下。
前置++与后置++格式分别如下:
Clock operator ++(Clock &p);
Clock operator ++(Clock &p, int);//需要记住,运算符++后置时需要两个形参,int类型做后缀,具体原因找度娘。
2.注意前置++与后置++的运算逻辑
前置++逻辑实现
Clock operator ++(Clock &p) {
p.s++;
//时间自增运算逻辑。
if (p.s == 60)
{
p.s = 0;
p.m++;
if (p.m == 60)
{
p.m = 0;
p.h++;
if (p.h == 24)
{
p.h = 0;
}
}
}
return p;
}
后置++逻辑实现
Clock operator ++(Clock &p, int) {//需要记住,运算符++后置时需要两个形参,int类型做后缀,具体原因找度娘。
Clock old = p;
++p;
return old;
}
三 代码实现
例:
#include<iostream>
using namespace std;
class Clock {
private:
int h, m, s;
public:
Clock(int nh = 0, int nm = 0, int ns = 0)
{
h = nh;
m = nm;
s = ns;
}
void show()
{
cout << h << ":" << m << ":" << s << endl;
}
friend Clock operator ++(Clock &p);//需要友元函数,获得访问时钟类私有成员权限。
friend Clock operator ++(Clock &p, int);
};
Clock operator ++(Clock &p) {
p.s++;
//时间自增运算逻辑。
if (p.s == 60)
{
p.s = 0;
p.m++;
if (p.m == 60)
{
p.m = 0;
p.h++;
if (p.h == 24)
{
p.h = 0;
}
}
}
return p;
}
//后置++函数表达式值并没有改变,例如a++只改变了a的值,a++表达式值,没有变!!!!!!!!!!!!
Clock operator ++(Clock &p, int) {//需要记住,运算符++后置时需要两个形参,int类型做后缀,具体原因找度娘。
Clock old = p;
++p;
return old;
}
int main() {
Clock first(23, 59, 59);
first.show();
(first++).show();
(++first).show();
return 0;
}
#include<iostream>
using namespace std;
class Clock {
private:
int h, m, s;
public:
Clock(int nh = 0, int nm = 0, int ns = 0)
{
h = nh;
m = nm;
s = ns;
}
void show()
{
cout << h << ":" << m << ":" << s << endl;
}
friend Clock operator --(Clock &p);//需要友元函数,获得访问时钟类私有成员权限。
friend Clock operator --(Clock &p, int);
};
Clock operator --(Clock &p) {
p.s--;
//时间自减运算逻辑。
if (p.s == -1)
{
p.s = 59;
p.m--;
if (p.m == -1)
{
p.m = 59;
p.h--;
if (p.h == -1)
{
p.h = 23;
}
}
}
return p;
}
//后置--函数表达式值并没有改变,例如a--只改变了a的值,a--表达式值,没有变!!!!!!!!!!!!
Clock operator --(Clock &p, int) {//需要记住,运算符--后置时需要两个形参,int类型做后缀,具体原因找度娘。
Clock old = p;
--p;
return old;
}
int main() {
Clock first(0, 0, 0);
first.show();
(first--).show();
(--first).show();
return 0;
}