注意:操作符重载可以当做==“自定义类的运算”==
1 为什么需要操作符重载?
对于基础的变量,int等,不需要重载就知道如何做,但是对于自定义类,就无法进行运算,比如复数类。
2 操作符重载总结
1)操作符重载本质上是一个函数,可以采用 友元函数或者成员函数实现。但是采用这两种函数传递参数、实现代码、应用场合均不同。
全局函数与成员函数的比较:
传递参数:全局函数中不传递this指针,成员函数默认传递this指针,因此成员函数可以少一个参数;
属性访问:成员函数可以访问私有变量,全局函数需要转化为友元函数才可以。
应用场合:正常写法采用成员函数。必须采用全局函数重载的运算符有<<和>>,必须采用成员函数重载的运算符有=、()、[ ]、->四个。
2)操作符重载的格式:
#全局函数
int operator+(const A& a1, const A& a2)
#成员函数
int operator+(const A& obj)
函数名为operator与运算符的组合(可变);
输入为对象(可变,友元函数或成员函数实现);
返回值可以为元素、对象或者引用(可变)。
3)可以重载的运算符
3 实例:实现complex类的±运算符重载
注意:
1)使用友元函数重载需要注意的是,二元运算则传递两个参数,同时添加friend关键字,使用成员函数只需要一个参数。
#include <iostream>
using namespace std;
class Complex
{
public:
Complex(int a, int b)
{
this->a = a;
this->b = b;
}
friend Complex operator+(const Complex& x1, const Complex& x2);
void printC()
{
cout << "a: " << this->a << "b:" << this->b << endl;
}
Complex operator-(const Complex& obj)
{
Complex tmp(this->a - obj.a, this->b - obj.b);
return tmp;
}
private:
int a;
int b;
};
//友元函数重载
Complex operator+(const Complex& x1, const Complex& x2)
{
Complex tmp(x1.a + x2.a, x1.b + x2.b);
return tmp;
}
void main()
{
Complex x1(1, 2);
Complex x2(3, 4);
Complex x3 = x1 + x2;
x3.printC();
Complex x4 = x2 - x1;
x4.printC();
cout << "hello,world..." << endl;
system("pause");
}
4 实例:基于3实现Complex类的前置–以及后置++
注意:
1)后置++需要在参数列表中增加占位符int,Complex operator++(Complex& obj, int)。
2)后置++先使用后++,如a++,在具体实现时就要先使用临时变量tmp暂存输入,而后++,最后返回临时变量。
3)使用成员函数实现比友元函数实现少一个参数,这个参数通过this指针传递。
4)传递的变量最好在引用&前使用const,保持变量的内存空间不能改变。
#include <iostream>
using namespace std;
class Complex
{
public:
friend Complex operator+(const Complex& x1, const Complex& x2);
friend Complex operator++(Complex& obj, int);
Complex(int a, int b)
{
this