在上一篇笔记中留下了一个问题,重载是否可以扩展为其他功能,答案是肯定的,今天我们这篇笔记讲的就是操作符重载。
在此之前,先提出一个问题,数学上有复数的相加减,那么程序上如何进行复数相加减呢?
有人会给出这样的答案:
class Complex
{
int a;
int b;
public:
Complex(int a = 0, int b =0)
{
this->a = a;
this->b = b;
}
};
然后建立两个对象,让两个对象相加,结果是错的,因为对象在一般情况下是无法进行加操作的。
那么有人就提出了,使用友元,建立一个函数,采用函数调用的形式,让两个对象相加。
#includes "stdio.h"
class Complex
{
int a;
int b;
public:
Complex(int a = 0,int b = 0)
{
this->a = a;
this->b = b;
}
int getA()
{
return a;
}
int getB()
{
return b;
}
friend Complex Add(const Complex& p1, const Complex& p2);
};
Complex Add(const Complex& p1, const Complex& p2)
{
Complex ret;
ret.a = p1.a + p2.a;
ret.b = p1.b + p2.b;
return ret;
}
int main()
{
Complex c1(1,2);
Complex c2(3,4);
Complex c3 = Add(c1,c2);
printf("c3.a = %d , c3.b = %d", c3.getA(), c3.getB());
return 0;
}
但是这是属于函数调用范围,有没有办法定义“+”号,遇到对象时自动调用该运算方式呢?
操作符重载
通过operator关键字可以定义特殊函数,其本质是通过函数重载操作符。
Complex operator +(const Complex& p1, const Complex& p2)
{
Complex ret;
ret.a = p1.a + p2.a;
ret.b = p1.b + p2.b;
return ret;
}
将以上的函数这样定义即可,而
Complex c3 = Add(c1,c2);
也可改为
Complex c3 = c1 + c2;
但由于其调用了友元函数,在前面的笔记中,我们也谈到,友元函数会极大的破坏C++的封装性,所以能不调用尽量不要调用。
那么可以将操作符重载函数定义为类的成员函数。
优势:
Ⅰ.比全局操作符重载函数少了一个参数(左操作数,因为类里有隐含的this指针)
Ⅱ.不需要依赖友元就可以完成操作符重载
Ⅲ.编译器优先在成员函数中寻找操作符重载函数
Complex operator + (const Complex& p)
{
Complex ret;
printf("Complex operator + (const Complex& p)\n");
ret.a = this->a + p.a;
ret.b = this->b + p.b;
return ret;
}
此时,主函数中的c1 + c2相当于
Complex c3 = c1 + c2; // c1.operator + (c2)
小结
*操作符重载是C++强大特性之一
*操作符重载的本质是通过函数扩展操作符功能
*operater关键字
*操作符重载遵循相同的函数重载规则
*全局函数和成员函数都可以实现对操作符的重载
*C++规定赋值操作符(=)只能重载为成员函数
以上资料均来自狄泰,群号:199546072,志同道合的朋友可以加我:
qq:335366243
微信:zhong_335366243