一、运算符重载
1.重载的含义
- 重载就是重新赋予新的含义。函数重载就是对一个已经由的函数重新赋予新的含义,使之实现新的功能。
- 运算符也可以被重载,例如:<<、>>等。
2.重载运算符的函数一般形式
函数类型 operator 运算符名称 (参数列表)
{
对运算符的重载处理
}
例如:
没有重载前
#include<iostream>
using namespace std;
class Time {
public:
Time(int year, int month, int day) : m_year(year), m_month(month), m_day(day)
{ }
Time();
Time time_add(Time& t);
void time_print();
private:
int m_year;
int m_month;
int m_day;
};
Time::Time(){}
Time Time::time_add(Time& d) {
Time ret;
ret.m_year = m_year + d.m_year;
ret.m_month = m_month + d.m_month;
ret.m_day = m_day + d.m_day;
return ret;
}
void Time::time_print() {
cout << m_year << " : " << m_month << " : " << m_day << endl;;
}
int main() {
Time a(1, 1, 1), b(2, 2, 2), c(3, 3, 3), d;
d = b.time_add(c);
d = a.time_add(d);
d.time_print();
return 0;
}
//可以看到实现一个加法十分麻烦,可读性低
重载后
#include<iostream>
using namespace std;
class Time {
public:
Time(int year, int month, int day) : m_year(year), m_month(month), m_day(day)
{ }
Time();
Time operator+(Time& d);
void time_print();
private:
int m_year;
int m_month;
int m_day;
};
Time::Time(){}
Time Time::operator+(Time& d) {
Time ret;
ret.m_year = m_year + d.m_year;
ret.m_month = m_month + d.m_month;
ret.m_day = m_day + d.m_day;
return ret;
}
void Time::time_print() {
cout << m_year << " : " << m_month << " : " << m_day << endl;;
}
int main() {
Time a(1, 1, 1), b(2, 2, 2), c(3, 3, 3), d;
d = a + b + c;
d.time_print();
return 0;
}
//可以看到重载后代码阅读性提高特别多,修改起来也更加方便。
3.重载的规则
- C++不允许程序员自己定义新的运算符,只能对C++已有的运算符进行重载。
- 不允许重载的运算符
1).(成员访问运算符)
2).*(成员指针访问运算符)
3)::(域运算符)
4)sizeof(大小运算符)
5)?:(条件运算符) - 重载不能改变运算符运算对象(操作数)个数。
- 重载不能改变运算符的优先级别。
- 重载不能改变运算符的结合性。
- 重载运算符的函数不能有默认的参数。
- 重载运算符必须和用户定义的类型的对象一起使用。(这样约定是为了防止用户修改用于标准类型结构的运算符性质)。
4. +是双目运算符为什么重载时只传递一个参数?
原因:由于重载的是类中的成员函数,有this指针隐式访问了类中的成员。
5.运算符重载函数除了可以作为类的成员函数外,也可以是非成员函数(放在类外),做友元函数。(不推荐,比较麻烦)
#include<iostream>
using namespace std;
class Time {
public:
Time(int year, int month, int day) : m_year(year), m_month(month), m_day(day)
{ }
Time();
friend Time operator+(Time& a, Time& b);
void time_print();
private:
int m_year;
int m_month;
int m_day;
};
Time::Time(){}
Time operator + (Time & a,Time & b) {
return Time(a.m_year + b.m_year, a.m_month + b.m_month, a.m_day + b.m_day);
}
void Time::time_print() {
cout << m_year << " : " << m_month << " : " << m_day << endl;;
}
int main() {
Time a(1, 1, 1), b(2, 2, 2),d;
d = a + b;
d.time_print();
return 0;
}