C++重新认知:运算符重载

一、运算符重载

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rain_ZZX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值