一、运算符重载的介绍
运算符重载就是给一些运算符赋予新的功能,使其能够用于新的数据类型,而不仅仅局限于基本数据类型。
其实在我们刚开始学习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; }