运算符重载就是对运算符进行重新定义,赋予另一种功能,以适应不同的数据类型。
每个运算符重载都有两种实现方式:
1> 成员函数实现
2> 全局函数实现
种类:+ 、 - 、 * 、 /、 %
表达式: L # R (L 左操作数 # 运算符 R右操作数)
左操作数:可以是左值,也可以是右值,运算过程中不能被改变。
右操作数:可以是左值,也可以是右值,运算过程中不能被改变。
结果:右值(不可以被改变)
1> 成员函数实现算术运算符重载:
const 类名 operator#(const 类名 &R) const
{}
//第一个const表示运算结果是个右值,不能被改变。
//第二个const表示右操作数在运算符过程中,不能被改变。
//第三个const表示左操作数在运算符过程中,不能被改变。
2> 全局函数实现算术运算符重载:
const 类名 operator#(const 类名 &L, const 类名 &R)
{}
种类: > 、 >= 、 < 、<=、== 、 !=
表达式:L # R (L 左操作数 # 运算符 R右操作数)
左操作数:可以是左值,也可以是右值,运算过程中不能被改变。
右操作数:可以是左值,也可以是右值,运算过程中不能被改变。
结果:bool
1> 成员函数实现关系运算符重载:
bool operator#(const 类名 &R)const
{}
2> 全局函数实现关系运算符重载:
bool operator#(const 类名 &L,const 类名 &L)
{}
种类:= 、 += 、 -= 、*= 、/= 、%=
表达式: L # R (L左操作数 #运算符 R右操作数)
左操作数:只能是左值,运算过程中要发生变化。
右操作数:可以是左值,也可以是右值,运算过程中,不能发生变化。
结果:自身的引用
1> 成员函数实现赋值运算符重载:
类名 &operator#(const 类名 &R)
{}
2> 全局函数实现赋值运算符重载:
类名&operator&( 类名 &L,const 类名 &R)
{}
种类:++ 、 --
以自增为例:
1)前置自增
表达式:++O (O操作数)
操作数:只能是左值,运算过程中需要被改变
结果:左值 (自身的引用)
1>成员函数实现前置自增运算符重载:
类名 &operator++()
{}
2>全局函数实现前置自增运算符重载:
类名 &operator++(类名 &O)
{}
2) 后置自增
表达式:O++
操作数:只能是左值,运算过程中需要被改变
结果:右值 (不能被改变)
1>成员函数实现后置自增运算符重载:
const 类名operator++(int)
{}
2>全局函数实现后置自增运算符重载:
const 类名operator++(类名 &O,int)
{}
插入符
提取符 >>
cout 是ostream类的类对象
cin 是istream类的类对象
//全局函数实现<<运算符重载
ostream &operator<<(ostream &cout, const Person &p)
{
cout << p.a << endl;
cout << p.b << endl;
return cout;
}
//全局函数实现>>运算符重载
istream & operator>>(istream &cin, Person &p)
{
cin >> p.a >> p.b ;
return cin;
}
对象访问成员 .
指针访问成员 ->
三目运算符 ? :
sizeof()
作用域限定符 ::