运算符重载

引言:多态性概述

1.多态性

多态:操作接口根据操作环境的不同一对多

多态性:一组方法在同一操作接口为不同的对象服务

2.多态的类型

重载多态:函数重载、运算符重载

强制多态:浮点数加整数

包含多态:不同类中的同名成员函数,通过虚函数实现

参数多态:类模板实例化时操作对象的类型不同

3.多态的实现

绑定:将一个标识符名和一个存储地址联系在一起的过程

(1)编译时的多态

绑定工作在编译连接阶段完成,静态绑定

如:重载多态、强制多态、参数多态

(2)运行时的多态

绑定工作在程序运行阶段完成,动态绑定

如:包含多态(虚函数)

运算符重载

定义:对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据时产生不同的行为。

目的:使得 C++ 中的运算符也能够用来操作对象。

实质:编写以运算符作为名称的函数。

运算符重载为友元函数时,参数的个数等于运算符的目数(即操作数的个数);运算符重载为成员函数时,参数的个数等于运算符的目数减1。

例子一:时间类的改进(重载+和-)

运算符重载为成员函数

Time Time::operator+(Time& a)const
//常函数:可以使用数据成员,不能进行修改,对函数的功能有更明确的限定
{
	Time m;
	m.hour = hour;
	m.minute = minute;
	m.second = second;
	m.second += a.second;
	if (m.second >= 60)
	{
		m.second -= 60;
		m.minute += 1;
	}
	m.minute += a.minute;
	if (m.minute >= 60)
	{
		m.minute -= 60;
		m.hour += 1;
	}
	m.hour += a.hour;
	if (m.hour >= 24)
	{
		m.hour -= 24;
	}
	return m;
}
Time Time::operator-(Time& b)const
{
	Time n;
	n.hour = hour;
	n.minute = minute;
	n.second = second;
	if ((n.hour * 3600 + n.minute * 60 + n.second) > (b.hour * 3600 + b.minute * 60 + b.second))
	{
		int s = ((n.hour * 3600 + n.minute * 60 + n.second) - (b.hour * 3600 + b.minute * 60 + b.second));
		n.hour = s / 3600;
		n.minute = (s - n.hour * 3600) / 60;
		n.second = s - n.hour * 3600 - n.minute * 60;
		return n;
	}
	else
	{
		int s = ((b.hour * 3600 + b.minute * 60 + b.second) - (n.hour * 3600 + n.minute * 60 + n.second));
		n.hour = s / 3600;
		n.minute = (s-n.hour*3600) / 60;
		n.second = s - n.hour * 3600 - n.minute * 60;
		return n;
	}
}

运算符重载为友元函数

Time operator+(Time& a, int s)
{
	Time m;
	m.second = a.second + s;
	if (m.second >= 60)
	{
		m.second -= 60;
		m.minute += 1;
	}
	m.minute += a.minute;
	if (m.minute >= 60)
	{
		m.minute -= 60;
		m.hour += 1;
	}
	m.hour += a.hour;
	if (m.hour >= 24)
	{
		m.hour -= 24;
	}
	return m;
}
Time operator+(int s, Time& a)
{
	Time m;
	m.second = a.second + s;
	if (m.second >= 60)
	{
		m.second -= 60;
		m.minute += 1;
	}
	m.minute += a.minute;
	if (m.minute >= 60)
	{
		m.minute -= 60;
		m.hour += 1;
	}
	m.hour += a.hour;
	if (m.hour >= 24)
	{
		m.hour -= 24;
	}
	return m;
}
Time operator-(Time& b, int s)
{
	Time n;
	if (b.second >= s)
	{
		n.second = b.second - s;
	}
	else
	{
		n.second = b.second + 120 - s;
		n.minute = n.minute + b.minute - 2;
		if (n.minute < 0)
		{
			n.minute += 60;
			n.hour--;
		}
		n.hour += b.hour;
		if (n.hour < 0)
		{
			n.hour += 24;
		}
	}
	return n;
}

完整代码 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
using namespace std;
class Time {
	int hour, minute, second;
public:
	Time(int h, int m, int s = 0);
	Time(int s = 0);
	int seccalc() { return(hour * 60 + minute) * 60 + second; }
	void settime(int h = 0, int m = 0, int s = 0);
	void print_12();
	void print_24();
	//重载+,重载为成员函数
	Time operator+(Time& a)const;
	//重载-,重载为成员函数
	Time operator-(Time& b)const;
    //重载为友元函数
	friend Time operator+(Time& a, int s);
	friend Time operator+(int s, Time& a);
	friend Time operator-(Time& b, int s);
};
Time::Time(int h, int m, int s)
{
	hour = h;
	minute = m;
	second = s;
}
Time::Time(int s) {
	hour = s / 3600;
	minute = (s - hour * 3600) / 60;
	second = s - hour * 3600 - minute * 60;
}
void Time::settime(int h, int m, int s)
{
	hour = h;
	minute = m;
	second = s;
}
void Time::print_12()
{
	if (hour <= 12)
	{
		cout << setw(2) << setfill('0') << hour << ":" << minute << ":" << second << " AM";
	}
	if (hour > 12)
	{
		cout << setw(2) << setfill('0') << hour - 12 << ":" << minute << ":" << second << " PM";
	}
}
void Time::print_24()
{
	cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second;
}
Time Time::operator+(Time& a)const
//常函数:可以使用数据成员,不能进行修改,对函数的功能有更明确的限定
{
	Time m;
	m.hour = hour;
	m.minute = minute;
	m.second = second;
	m.second += a.second;
	if (m.second >= 60)
	{
		m.second -= 60;
		m.minute += 1;
	}
	m.minute += a.minute;
	if (m.minute >= 60)
	{
		m.minute -= 60;
		m.hour += 1;
	}
	m.hour += a.hour;
	if (m.hour >= 24)
	{
		m.hour -= 24;
	}
	return m;
}
Time Time::operator-(Time& b)const
{
	Time n;
	n.hour = hour;
	n.minute = minute;
	n.second = second;
	if ((n.hour * 3600 + n.minute * 60 + n.second) > (b.hour * 3600 + b.minute * 60 + b.second))
	{
		int s = ((n.hour * 3600 + n.minute * 60 + n.second) - (b.hour * 3600 + b.minute * 60 + b.second));
		n.hour = s / 3600;
		n.minute = (s - n.hour * 3600) / 60;
		n.second = s - n.hour * 3600 - n.minute * 60;
		return n;
	}
	else
	{
		int s = ((b.hour * 3600 + b.minute * 60 + b.second) - (n.hour * 3600 + n.minute * 60 + n.second));
		n.hour = s / 3600;
		n.minute = (s-n.hour*3600) / 60;
		n.second = s - n.hour * 3600 - n.minute * 60;
		return n;
	}
}
Time operator+(Time& a, int s)
{
	Time m;
	m.second = a.second + s;
	if (m.second >= 60)
	{
		m.second -= 60;
		m.minute += 1;
	}
	m.minute += a.minute;
	if (m.minute >= 60)
	{
		m.minute -= 60;
		m.hour += 1;
	}
	m.hour += a.hour;
	if (m.hour >= 24)
	{
		m.hour -= 24;
	}
	return m;
}
Time operator+(int s, Time& a)
{
	Time m;
	m.second = a.second + s;
	if (m.second >= 60)
	{
		m.second -= 60;
		m.minute += 1;
	}
	m.minute += a.minute;
	if (m.minute >= 60)
	{
		m.minute -= 60;
		m.hour += 1;
	}
	m.hour += a.hour;
	if (m.hour >= 24)
	{
		m.hour -= 24;
	}
	return m;
}
Time operator-(Time& b, int s)
{
	Time n;
	if (b.second >= s)
	{
		n.second = b.second - s;
	}
	else
	{
		n.second = b.second + 120 - s;
		n.minute = n.minute + b.minute - 2;
		if (n.minute < 0)
		{
			n.minute += 60;
			n.hour--;
		}
		n.hour += b.hour;
		if (n.hour < 0)
		{
			n.hour += 24;
		}
	}
	return n;
}
int main()
{
	Time t1(2, 34), t2, t3;
	t2.settime(13, 23, 34);
	cout << "t1+t2:";
	t3 = t1 + t2;
	t3.print_24();
	cout << "\nt1+65:";
	t3 = t1 + 65;
	t3.print_24();
	cout << "\n65+t1:";
	t3 = 65 + t1;
	t3.print_24();
	cout << "\nt2-t1:";
	t3 = t2 - t1;
	t3.print_24();
	cout << "\nt1-70:";
	t3 = t1 - 70;
	t3.print_24();
	return 0;
}

例子二:C++重载<<和>>(C++重载输出和输入运算符)

class student {
	string ID;
	string name;
	char xb;
	int score;
public:
	student(string i = "XXX", string n = "XXX", char x = 'm', int s = 0) :ID(i), name(n), xb(x), score(s) { };
	friend ostream& operator<<(ostream& os, const student& s);
	friend istream& operator>>(istream& is, student& s);
};
ostream& operator<<(ostream& os, const student& s)
{
	os << s.ID << " " << s.name << " " << s.xb << " " << s.score;
	return os;
}
istream& operator>>(istream& is, student& s)
{
	is >> s.ID >> s.name >> s.xb >> s.score;
	return is;
}
int main()
{
	student s;
	cin >> s;
	cout << s;
	return 0;
}

例子三:前置和后置单目运算符重载,++

class Clock {
	int hour, minute, second;
public:
	Clock(int h, int m, int s) :hour(h), minute(m), second(s) { };
	void showTime()
	{
		cout << hour << ":" << minute << ":" << second << endl;
	}
	Clock& operator++();//前置单目运算符重载
	Clock operator++(int);//后置单目运算符重载
};
Clock& Clock::operator++()
{
	second++;
	if (second >= 60)
	{
		second -= 60;
		minute++;
		if (minute >= 60)
		{
			minute -= 60;
			hour++;
			if (hour >= 24)
			{
				hour -= 24;
			}
		}
	}
	return *this;
}
Clock Clock::operator++(int)
{
	Clock old = *this;
	++(*this);
	return old;
}
int main()
{
	Clock myClock(23, 59, 59);
	cout << "First time output: ";
	myClock.showTime();
	cout << "Show myClock++:    ";
	(myClock++).showTime();
	cout << "Show ++myClock:    ";
	(++myClock).showTime();
	return 0;
}

未完待续……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值