C++为了增强代码的可读性引入了运算符重载, 运算符重载本质上是具有特殊函数名的函数, 也具有其返回值类型, 函数名字以及参数列表, 其返回值类型与参数列表与普通的函数类似.
函数名字为:关键字operator后面接需要重载的运算符符号.
函数原型:返回值类型operator操作符(参数列表)
注意:
- 不能通过连接其它符号来创建新的操作符: 比如operator@ , @这个字符本身不是操作符
- 重载操作符必须要有一个类 类型或者枚举类型的操作数
- 用于内置类型的操作符,其含义不能改变, 例如:内置的整型+, 不能改变其含义
- 作为类成员的重载函数时, 其形参看起来比操作数, 数目少1个成员函数的操作符有一个默认的形参this, 限定为为第一个形参
- 不能重载的运算符 (1) .* (2) :: (3)sizeof (4)?: (5).
假设现在有一个需求, 需要直接判断日期是否相等, 我们以日期类和 '==' 运算符为例 , 具体认识一下运算符重载的作用
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
// '=='函数重载函数
bool operator==(const Date& d1, Date& d2)
{
return d1._year == d2._year
&& d1._month == d2._month
&& d1._day == d2._day;
}
int main()
{
d1(2022,12,7)
d2(2022,12,8)
cout << (d1 == d2) <<endl;
return 0;
}
'=='函数重载之后, 我们就可以任意判断两个日期是否相等, 相较于之前用函数传参的写法来说是会方便许多. 同样的道理, 我们可以对 '>=' '<=' '+=' '-='等预算符进行重载, 那么对于这个日期类而言, 就可以随意对比较或者加减, 这样就很有意义了.
赋值运算符主要有四点:
1. 参数类型
2. 返回值
3. 检测是否自己给自己赋值
4. 返回*this
5. 如果一个类没有显式定义赋值运算符重载, 编译器也会生成一个, 完成对象按字节序的值拷贝.