运算符重载的语法规则
返回值类型 operator运算符(操作数1,操作数2,...)
运算符的操作数有几个,则参数列表有几个参数,对应顺序依次是左操作数,右操作数
当重载了对应运算符时,编译器在识别到对应参数的运算符操作则会对应替换为重载的函数调用
运算符重载的意义
自定义的运算符一般用于适配自定义类型,使代码可读性提高,如实现Date类型的加减等,如下实现一个简化的Date类型加法例子:
#include <iostream>
using namespace std;
class Date {
public:
Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}
// 重载 + 运算符,返回一个日期加上指定天数后的新日期
Date operator+(int days) const {
Date result = *this;
result.day_ += days;
// 处理月份和年份的进位
while (result.day_ > daysInMonth(result.year_, result.month_)) {
result.day_ -= daysInMonth(result.year_, result.month_);
result.month_++;
if (result.month_ > 12) {
result.month_ = 1;
result.year_++;
}
}
return result;
}
void display() const {
cout << year_ << "-" << month_ << "-" << day_ << endl;
}
private:
int year_;
int month_;
int day_;
// 获取指定年份和月份的天数
int daysInMonth(int year, int month) const {
// 简化处理,假设每个月都有30天
return 30;
}
};
int main() {
Date date1(2024, 2, 20);
Date date2 = date1 + 10; // 日期加上10天
date2.display();
return 0;
}
可重载的运算符
C++中大多运算符都可以进行重载,不可重载的运算符包括成员访问运算符 .、域运算符 ::、长度运算符 sizeof 等
tips:
-
不能通过连接C++/C里没有的符号来创建新的操作符如operator@()
-
不能改变内置类型的运算符的含义(如+重载成减法含义)
-
重载操作符必须有一个自定义类的类型,因为重载操作符的语法就是为了自定义类型而生(如:不能重载两个int类型相加)
-
作为类成员函数重载时,形参隐含了this
-
运算符重载与函数重载没有关系,运算符重载只是使同一个运算符可以拥有更多的功能特性
-
重载前置++和后置++时,c++规定后置++的参数默认加上int进行占位,编译器在遇到后置++时会自动传参
-
重载流运算符时,应使用全局函数,因为如果作为类内成员函数重载,默认会带有一个“this”的参数
ostream& operator<<(ostream& os, const YourClass& obj);
ps: operator new/operator delete非运算符重载,关于new和delete: new和delete简介