一、运算符重载的介绍
运算符重载就是给一些运算符赋予新的功能,使其能够用于新的数据类型,而不仅仅局限于基本数据类型。
其实在我们刚开始学习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;
}
本文详细介绍了C++中的运算符重载概念及其应用,包括如何通过成员函数和友元函数实现运算符重载,以及重载左移和右移运算符的方法。通过实例演示了如何对自定义类中的数据进行加减等运算。
1047

被折叠的 条评论
为什么被折叠?



