个人主页 :阿然成长日记 点击可跳转
个人专栏: 数据结构与算法C语言进阶
不能则学,不知则问,耻于问人,决无长进
C++为了增强代码的可读性引入了运算符重载。运算符重载是具有特殊函数名的函数,其目的就是让
自定义类型
可以像内置类型一样可以直接使用运算符进行操作。运算符重载,就是对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据时产生不同的行为。运算符重载的目的是使得 C++ 中的运算符也能够用来操作对象。
例如:两个日期的比较,肯定不能单纯的使用==
去比较,==
只能运算两个标准类型的值。所以这时我们可以写一个函数来实现日期的比较。并使用运算符重载的方式给这个函数,名命名为‘-
’.这样我们就可以使用 ==
实现像是标准类型那般使用。
函数名字:关键字operator
后面接需要重载的运算符符号
。
函数格式:
<返回类型说明符> operator <运算符符号>(参数列表)
{
函数体
}
如下,比较两个日期函数。
#include
using namespace std;
class Date
{
public:
Date(int year = 0, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
public:
//private:
int _year;
int _month;
int _day;
};
bool operator==(const Date& x1,const Date& x2)
{
return x1._year == x2._year
&& x1._month == x2._month
&& x1._day == x2._day;
}
int main()
{
//创建两个对象,并赋初始值
Date d1(1919, 9,9);
Date d2(1919,9,9);
if (d1 == d2) {
cout << "true" << endl;
}
else {
cout << "false" << endl;
}
return 0;
}
注意点:
友元函数
就可以访问到函类中的private
型变量了。operator@
,只能是运算符
。类类型
参数。含义不能改变
,例如:内置的整型+,不 能改变其含义.*
::
sizeof
?:
.
注意以上5个运算符不能重载。1.重载操作符必须有一个类类型
参数。
2.函数如果在类中,那么它的参数中才有会有隐藏的this指针
(它会抢占最左边位置)。但是,函数如果定义在类外,就成一个全局函数,就没有this指针了。
3.一般的运算符写成成员函数。但是流运算符函数要写在类外,在类中有声明,这样就要自己给参数,没有this指针,就可以写成cou<
下面的代码是写在类外的,所以两个参数都是自己手动传的。
bool operator==(const Date& x1,const Date& x2)
{
return x1._year == x2._year
&& x1._month == x2._month
&& x1._day == x2._day;
}
将代码写进类中。
bool operator==(const Date& x2)
{
return _year == x2._year
&& _month == x2._month
&& _day == x2._day;
}