💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
前言:
C++为了增强代码的可读性引入了运算符重载。运算符重载是具有特殊函数名的函数,其目的就是让
自定义类型
可以像内置类型一样可以直接使用运算符进行操作。运算符重载,就是对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据时产生不同的行为。运算符重载的目的是使得 C++ 中的运算符也能够用来操作对象。
例如:两个日期的比较,肯定不能单纯的使用==
去比较,==
只能运算两个标准类型的值。所以这时我们可以写一个函数来实现日期的比较。并使用运算符重载的方式给这个函数,名命名为‘-
’.这样我们就可以使用 ==
实现像是标准类型那般使用。
一、赋值运算符重载的定义
函数名字:关键字operator
后面接需要重载的运算符符号
。
函数格式:
<返回类型说明符> operator <运算符符号>(参数列表)
{
函数体
}
二、赋值运算符重载的使用
如下,比较两个日期函数。
#include<iostream>
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;
}
注意点:
- 由于是自定义类型传参,我们若是使用传值传参,会额外调用一次拷贝构造函数,所以函数的参数最好使用引用传参
- 上述代码中类的成员变量访问限定符是public。否则下面的函数无法访问到。可以使用
友元函数
就可以访问到函类中的private
型变量了。 - 对于参数,在函数体内不会对其进行修改,所以最好加上const进行修饰。
- bool operator==(const Date& x1,const Date& x2)定义在类外,是全局函数,参数中不存在this指针。
三、使用细节
- 不能通过连接其他符号来创建新的操作符:比如
operator@
,只能是运算符
。 - 重载操作符必须有一个
类类型
参数。 - 用于内置类型的运算符,其
含义不能改变
,例如:内置的整型+,不 能改变其含义 - 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐
藏的this .*
::
sizeof
?:
.
注意以上5个运算符不能重载。
四、运算符重载的参数问题
1.重载操作符必须有一个类类型
参数。
2.函数如果在类中,那么它的参数中才有会有隐藏的this指针
(它会抢占最左边位置)。但是,函数如果定义在类外,就成一个全局函数,就没有this指针了。
3.一般的运算符写成成员函数。但是流运算符函数要写在类外,在类中有声明,这样就要自己给参数,没有this指针,就可以写成cou<<d1;在传参时,有一个默认的隐藏的this指针参数。会影响顺序。
例如:
下面的代码是写在类外的,所以两个参数都是自己手动传的。
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;
}
参数传入