二十 操作符重载(operator)
1 双目操作符重载 L#R
1.1 计算类双目操作符: + - …
1)表达式结果是右值,不能对表达式结果再赋值
2)左右操作数既可以是左值也可以是右值
3)两种具体实现方式
–》成员函数形式(左调右参)
L#R的表达式可以被编译器处理为"L.operator#®"成员函数调用形式,该函数的返回就是表达式结果。
–》全局函数形式(左右都参)
L#R的表达式可以被编译器处理为"operator#(L,R)"全局函数调用形式,该函数的返回就是表达式结果。
注:通过friend关键字可以把一个全局函数声明为某个类的友元,对于友元函数可以访问类中的任何成员。
#include <iostream>
using namespace std;
//复数类
class Complex{
public:
Complex(int r,int i):m_r(r),m_i(i){
}
void print(void) const {
cout << m_r << '+' << m_i << 'i' << endl;
}
//重载+:成员函数形式
//c1+c2 ==> c1.operator+(c2)
//1)修饰返回值:禁止对表达式结果再赋值
//2)常引用参数:支持常量型右操作数
//3)常成员函数:支持常量型左操作数
const Complex operator+(const Complex& c)const{
Complex res(m_r+c.m_r,m_i+c.m_i);
return res;
}
private:
int m_r;//实部
int m_i;//虚部
//友元函数
friend const Complex operator-(
const Complex& l,const Complex& r);
};
//重载-:全局函数形式
//c2-c1 ==> operator-(c2,c1)
const Complex operator-(const Complex& l,const Complex& r){
Complex res(l.m_r-r.m_r,l.m_i-r.m_i);
return res;
}
int main(void){
const Complex c1(1,2);
const Complex c2(3,4);
c1.print();
c2.print();
//Complex c3 = c1.operator+(c2)
Complex c3 = c1 + c2;
c3.print();//4+6i
//Complex c4 = operator-(c2,c1)
Complex c4 = c2 - c1;
c4.print();//2+2i
return 0;
}
1.2 赋值类双目操作符: += -= …
1)表达式结果是左值,就是左操作数的自身
2)左操作数一定是左值,右操作数可以是左值也可以是右值
3)两种具体实现方式
–》成员函数形式(左调右参),L#R ==
> L.operator#®
–》全局函数形式(左右都参),L#R ==> operator#(L,R)
#include <iostream>
using namespace std;
class Complex{
public:
Complex(int r,int i):m_r(r),m_i(i){
}
void print(void) const {
cout << m_r << '+' << m_i << 'i' << endl;
}
//+=:成员函数形式
//c1+=c2 ==> c1.operator+=(c2)
Complex& operator+=(const Complex& c){
m_r += c.m_r;
m_i += c.m_i;
return *this;
}
//-=:全局函数形式
//友元函数可以定义在类的内部,但本质还是全局函数
//c1-=c2 ==> operator-=(c1,c2)
friend Complex& operator-=(Complex& l,const Complex& r){
l.m_r -= r.m_r;
l.m_i -= r.m_i;
return l;
}
private:
int m_r;//实部
int m_i;//虚部
};
int main(void){
Complex c1(1,2);
Complex c2(3,4);
c1+=c2;//c1.operator+=(c2)
c1.print();//4+6i
Complex c3(5,6);
(c1+=c2) = c3;
c1.print();//5+6i
c1-=c2;//operator-=(c1,c2)
c1.print();//2+2i
(c1-=c2) = c3;
c1.print();//5+6i
return 0;
}
2 单目操作符重载 #O
1.1 计算类单目操作符:-(负) ~(位反) …
1)表达式结果是右值,不能对表达式结果再赋值
2)操作数既可以是左值也可以是右值
3)两种具体实现方式
–》成员函数形式:#O ==
> O.operator#()
–》全局函数形式:#O==
> operator#(O)
#include <iostream>
using namespace std;