C++复习之路十——运算符重载

一、运算符重载的介绍

运算符重载就是给一些运算符赋予新的功能,使其能够用于新的数据类型,而不仅仅局限于基本数据类型。

其实在我们刚开始学习c++的时候我们就已经接触了运算符重载,我们在c++中的输出数据都是用的这样的形式

int a = 0;
cout << a;

<<这个左移运算符就是运算符重载,我们之前都是使用这个运算符完成左移操作的,但是在c++中我们用它来输出数据。

【注意】:重载的运算符实质上就是函数

运算符重载也需要一个返回类型,参数列表以及函数体,但是与普通函数不同的是,它的名字由operator加上需要重载的运算符组成

我们只能对已经存在的运算符进行重载,不能创造新的新的运算符,并且不能改变原来运算符的优先级和结合律

【注意】:并不是所有的运算符都可以重载的,可以重载的运算符最后列出来。

二、运算符重载的声明

我们先创建一个Date类。

class Date
{
public:
	Date(); //无参构造函数
	Date(int hour, int min, int sec);//带三个参数的构造函数
	void print();//打印日期
private:
	int m_hour;
	int m_min;
	int m_sec;
};

然后我们用这个类定义两个Date对象,d1(2,3,4), d2(5,6,7),如果我们想将这两个日期相加,并且只用+这个运算符就能够实现,那么我们就需要将+运算符重载。

将运算符重载作为类的成员函数

Date operator+(Date &d); //+运算符重载作为类的成员函数

注意了,+运算符的运算对象应该是两个,虽然这个函数看上去只有一个参数,但其实它的第一个运算对象已经绑定到了this指针上了。如果我们要使用重载后的运算符,我们可以这样写。

Date t1(2,3,4);
Date t2(4,5,6);
t1+t2;
上面的t1+t2,相当于我们这样写t1.operator+(t2);显然t1+t2要方便的多,这就是运算符重载的好处。


将运算符重载作为类的友元函数

friend Date operator+(Date &d1, Date &d2);

因为友元函数不是类的成员函数,所以没有this指针,所以我们只能讲两个对象都作为参数。然后我们也就可以使用t1+t2来将两个Date对象相加。

两种方法的区别

将函数重载作为类的成员函数,参数列表里的形参会比使用友元函数的形参列表少一个。

三、重载左移运算符

如果我们想用cout << t1 这种方式来输出t1中的数据,也得重载左移运算符,因为cout << 只能输入基本的数据类型,如果没有重载这个运算符编译的时候会报错。

friend ostream& operator<<(ostream &out, Date &d); //左移运算符重载

第一个参数是输出流类对象的引用,第二个参数是Date类对象的引用。返回类型是一个ostream的引用。

<<左移运算符的第一个运算对象是ostream的成员。我们不能改变ostream类中的成员,所以我们只能使用友元函数来声明

右移运算符和左移运算符重载差不多。

【注意】:在我们重载左移和右移运算符的时候一定要用友元函数来声明

四、可以被重载的运算符

+ - * / % ^
& | ~ ! , =
< > <= >= ++ --
<< >> == != && ||
+= -= /= %= ^= &=
|= *= <<= >>= [] ()
-> ->* new new[] delete delete[]

最后提供我自己写的Date类的代码

#include <iostream>

using namespace std;

class Date
{
public:
	Date(); //无参构造函数
	Date(int hour, int min, int sec);//带三个参数的构造函数
	void print();//打印日期
	Date operator+(Date &d);//+运算符重载
	Date operator-(Date &d);//-运算符重载
	Date operator=(Date &d);//=运算符重载
private:
	int m_hour;
	int m_min;
	int m_sec;

	//友元函数
	//因为第一个参数是ostream类对象,所以只能使用友元函数。
	friend ostream& operator<<(ostream &out, Date &d); //左移运算符重载
	friend istream& operator >> (istream &in, Date &d);//右移运算符重载
};
//初始化
Date::Date()
{
	m_hour = 0;
	m_min = 0;
	m_sec = 0;
}
//初始化
Date::Date(int hour, int min, int sec)
{
	m_hour = hour;
	m_min = min;
	m_sec = sec;
}
//打印日期
void Date::print()
{
	cout << this->m_hour << "时" << this->m_min << "分" << this->m_sec << "秒" << endl;
}
//将日期转换成普通的时分秒
Date Date::operator+(Date &d)
{
	Date temp;
	temp.m_sec = this->m_sec + d.m_sec;
	temp.m_min = this->m_min + d.m_min;
	temp.m_hour = this->m_hour + d.m_hour;

	if (temp.m_sec >= 60)
	{
		temp.m_min = temp.m_sec / 60 + temp.m_min;
		temp.m_sec = temp.m_sec % 60;
		if (temp.m_min >= 60)
		{
			temp.m_hour = temp.m_min / 60 + temp.m_hour;
			temp.m_min = temp.m_min % 60;
		}
	}
	else if (temp.m_sec < 60 && temp.m_min >= 60)
	{
		temp.m_hour = temp.m_min / 60 + temp.m_hour;
		temp.m_min = temp.m_min % 60;
	}
	
	return temp;
}
//-运算符重载
Date Date::operator-(Date & d)
{
	Date temp;
	temp.m_hour = this->m_hour - d.m_hour;
	temp.m_min = this->m_min - d.m_min;
	temp.m_sec = this->m_sec - d.m_sec;

	if (temp.m_hour < 0)//如果小时相减小于0,就将时间设为0
	{
		temp.m_hour = 0;
		temp.m_min = 0;
		temp.m_sec = 0;
	}
	else if (temp.m_hour >= 0 && temp.m_min < 0)如果小时>0分小于0,就将分秒清零
	{
		temp.m_min = 0;
		temp.m_sec = 0;
	}
	else if (temp.m_hour >= 0 && temp.m_min >= 0 && temp.m_sec < 0)//如果只是秒小于0,则将秒清零
	{
		temp.m_sec = 0;
	}

	return temp;
}

Date Date::operator=(Date &d)
{
	this->m_hour = d.m_hour;
	this->m_min = d.m_min;
	this->m_sec = d.m_sec;
	return *this;
}
//输出正常的时分秒
ostream & operator<<(ostream &out, Date &temp)
{
	if (temp.m_sec >= 60)
	{
		temp.m_min = temp.m_sec / 60 + temp.m_min;
		temp.m_sec = temp.m_sec % 60;
		if (temp.m_min >= 60)
		{
			temp.m_hour = temp.m_min / 60 + temp.m_hour;
			temp.m_min = temp.m_min % 60;
		}
	}
	else if (temp.m_sec < 60 && temp.m_min >= 60)
	{
		temp.m_hour = temp.m_min / 60 + temp.m_hour;
		temp.m_min = temp.m_min % 60;
	}
	out << "现在是:";
	out << temp.m_hour << "时" << temp.m_min << "分" << temp.m_sec << "秒";
	return out;
}

istream& operator >> (istream &in, Date &d)
{
	in >> d.m_hour >> d.m_min >> d.m_sec;
	return in;
}

int main()
{
	Date d1(2, 2, 2);
	Date d2(2, 2, 2);
	Date d3;
	d3 = d2 + d1;
	//d3 = d2.operator+(d1);
	
	/*Date d4;
	d4 = d3;*/
	cout << d3 << endl; 
	system("pause");
	return 0;
}


猜你喜欢

转载自blog.csdn.net/y____xiang/article/details/80032795