0、引言
重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一个篮子装蔬菜,也可以装水果或者其它,使用的是同一个篮子,但是可以用篮子重复装载的东西不一样。
正如在之前的文章《重载的奥义之函数重载》中介绍的类似,函数的重载是指利用相同的函数名设计一系列功能相近,但是功能细节不一样的函数接口;因此运算符重载也是指对于同一个运算符来说,它可以用于实现不同的功能。下面就一起来理解下运算符重载的应用。
1、运算符重载定义
正常来说,我们一般使用的运算符是对基本的数据类型进行操作,但是在C++中有了对象,导致对象无法通过运算符进行运算,故引入了运算符重载即需要重新的定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性。
运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,唯一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下:
其中,“返回类型说明符”指出重载运算符的返回值类型,operator是定义运算符重载函数的关键字,“运算符符号”指出要重载的运算符名字,是C++中可重载的运算符,比如要重载加法运算符,这里直接写“+”即可,“参数表”指出重载运算符所需要的参数及其类型。可以看出,运算符重载是一种形式C++多态的体现。
例如,使用“+”将两个对象相加,编译器将根据操作数的数目和类型决定使用哪种加法定义,这样可以让代码看起来更加自然。
运算符重载就是对已有的运算符重新进行定义,赋予其另一种功能,以达到适应不同的数据类型。运算符重载不能改变它本来的寓意(也就是加法不能变更为减法),运算符重载只是一种 “语法上的方便” ,它只是一种函数调用的方式。
2、作为成员函数进行重载
我们就以“+”运算符重载举例:
运行结果为:
从上面的例子可以看出,在addfloat类中对“+”运算符进行了重载 ,重载后可以对该类的对象进行加法运算。当运行 t = m + n时,编译器检测到“+”左边的m(“+”具有左结合性,所以先检测左边)是一个 addfloat类对象,就会调用成员函数 operator+(),将表达式转换成如下格式:
t = m.operator + (n);
表达式中m作为调用函数的对象,n作为函数的实参。
3、作为全局函数进行重载
对于之前的例子:t = m + n,m和n是作为addfloat类的对象进行相加的,使用成员函数 operator+()转换为了t = m.operator+(n),如果n不是类的对象,而是一个常数,例如:
t = m + 5.2;那么可以转换t = m.operator+(5.2);
但是如果m是一个常数时,即:t = 5.2 + n;则t = (5.2).operator + (n)这种转换是不允许的,编译器会报错,因为5.2不能作为类的对象调用运算符重载operator+()函数。
这