一.运算符重载简介
1.运算符重载实质
(1) 对已有的运算符赋予多重含义
(2) 必要性:C++预定义的运算符运算对象只能是基本数据类型,而不适用于用户自定义类型(如 类)
(3) 实现机制:
- 将指定的运算符表达式转化为对运算符函数的调用,运算对象转化运算符函数的实参。
- 编译系统对重载运算符的选择,遵循函数重载的选择原则。
2.规则和限制
(1) 可以重载的运算符:
上述运算符中,[ ] 是下标运算符,()是函数调用运算符,++和 – 是自增自减运算符包括前置后置形式。
另外,有4个运算符不能重载,即 长度运算符 sizeof、条件运算符 ?:、成员选择符== . == 和域解析运算符== : : == 。
(2) 其他规则
- 不改变原运算符的优先级和结合性。
- 不能改变操作数个数。
- 经重载的运算符,其操作数中至少应该有一个是自定义类型。
二.运算符的重载形式
1.重载为类成员函数
声明形式:
函数类型 operator 运算符(形参)
{
函数体;
}
重载为友元函数时,参数个数=原操作数个数-1 (后置++、–除外)。
(1) 双目运算符
如果重载运算符B 为类成员函数,使之能实现表示式oprd1 B oprd2, 其中oprd1位 A类对象,则 B 可被重载为 A 类的成员函数,形参类型是 oprd2 所属类型。经重载过,表达式 oprd1 B oprd2 相当于oprd1.operator B(oprd2)
举例说明:
重载 + 、+=,实现复数类complex 对象想相加。
#include<iostream>
using namespace std;
class complex
{
public:
complex(double real = 0.0, double image = 0.0)
{
this->real = real;this->image = image;}
complex operator + (complex &c1); // 重载 + 为成员函数
void operator += (complex &c1); //重载 +=
int showComplex(); //输出复数
private:
double real;
double image;
};
complex complex::operator + (complex &c1) //重载 + 为成员函数的实现
{
/*complex c; //实现1:创建一个局部变量
c.real = c1.real + real;
c.image = c1.image + image;
return c;
*/
return complex(c1.real + real, c1.image + image); //实现2:创建临时变量,直接一句代码返回结果
}
void complex::operator+=(complex &c1) //重载 +=
{
real += c1.real;
image += c1.image;
}
int complex::showComplex()
{
cout << real;
if (image > 0)
cout << "+";
if (image != 0)
cout << image << "i" << endl;
return 0;
}
int main()
{
complex c1(1, 2), c2(-3, 4), c3;
cout << "c1=";c1.showComplex();
cout << "c2=";c2.showComplex();
c3 = c1 + c2; //重载+ 的使用,两边都为complex对象
cout << "c3=c1+c2=";c3.showComplex();
c2 += c1;//重载+= 的使用,两边都为complex对象
cout << "c2+=c1结果: ";c2.showComplex();
return 0;
}
(2) 前置单目运算符
如果要重载 U 为类成员函数,使之能够实现表达式 U oprd,其中 oprd 为A类对象,则 U 可被重载为 A 类的成员函数,无形参。经重载后,表达式 U oprd 相当于 oprd.operator U()
(3) 后置单目运算符 ++和–
复习一下++ 、–
示例 | 解释 |
---|---|
++i | i自增1后再参与运算;i的值加1,++i的值也加1 |
i++ | i参与运算后,i的值再加1;i的值加1,i++的值不变 |
如果要重载 ++或–为类成员函数,使之能够实现表达式 oprd++ 或 oprd-- ,其中 oprd 为A类对象,则 ++或-- 可被重载为 A 类的成员函数,且具有一个 int 类型形参。经重载后,表达式 oprd++ 相当于oprd.operator ++(0)
举例说明(1):
++ 实现Point类的坐标自增
#include<iostream>
using namespace std;
class Point
{
private:
int x, y;
public:
Point(int x, int y)
{
this->x = x;
this->y = y;
}
Point() {
}
Point & operator++();//重载前置单目运算符++为成员函数 ++i i加1,i++整体值加1
Point operator