一、概念
重载是可使函数、运算符等处理不同类型数据或接受不同个数的参数的一种方法。
重载只是一种语言特性,是一种语法规则。
二、重载的表现形式
1、函数重载
函数重载就是函数名称相同,但定义却不同。函数重载使得程序员可以将一系列的函数族定义为一个统一的界面,但是却可以处理不同类型数据或接受不同个数的参数。这实现了统一接口,不同定义的思想。
简单地将函数重载概括为:两必须一可以
参数名必须相同。
参数列表必须不相同。
返回类型可以不相同。
函数重载与多态
重载是一种多态,有四种形式的多态:
虚函数多态:通过派生类重写基类函数
模板多态:
重载
转换
从基于绑定时间的多态分类,分为两种:动态(运行时多态)和静态(编译时多态)。
从这方面考虑函数重载是编译时多态,即静态多态,根据不同类型函数编译时会产生不同的名字如int_function和char_function等等,以此来区别调用。故重载仍符合多态定义——通过单一标识支持不同特定行为的能力,只是重载属于静态多态,而不是通过继承和虚函数实现的动态多态。
2、运算符重载
运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
运算符的重载在实际编程中使用很普遍,例如,“+”运算符既可以用于整数加,也可以用于浮点加,甚至是字符串的链接。
(1)为什么使用运算符重载?
有些数据类型需要用运算符连接来表达新的含义,如果不进行重载(重新定义),系统会按运算符的本来含义进行运算,这样会造成不可以进行运算或者不合逻辑,所以在运算前,需要给用到的运算符进行重新定义,通过重新定义运算符,使它能够用于特定类的对象执行特定的功能。
(2)可以重载的运算符有哪些?
一元运算符:
+, -, !, ~, ++, --, true, false
二元运算符:
+, -, *, /, %, &, |, ^, <<, >>
关系运算符:
==, !=, <, >, <=, >=
必须成对存在
返回布尔值。
(3)定义
与类定义相似.
返回类型 operator 运算符 (形式参数表) { 函数体 }
例如: public static vector operator +(vector i)
参数个数的限定:
非成员函数:
单目运算符:参数表中只有一个参数;
双目运算符:参数表中只有两个参数
成员函数:
单目运算符:参数表中没有参数;
双目运算符:参数表中只有一个参数
三、对比
重载(overload)
a 同一个类内发生
b 函数名字必须相同
c 参数必须不同不同
d 返回类型可以不同
重写(override):也叫覆盖。发生在继承关系中。派生类函数覆盖基类函数,实现不一样。
a 不同的范围,分别位于基类和派生类中
b 函数的名字相同
c 参数相同
d 基类函数必须有virtual关键字
e static 函数不可以被重写。
重新定义:是指派生类的函数屏蔽了与其同名的基类非虚(virtual)函数。
a 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
b 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。
其实就是一句话,只要基类中的函数不用virtual修饰,那么派生类出现于基类同名的函数,基类的函数被隐藏。
四、重载的优点
同一接口,不同定义。便于编程。
例如,当一个类中相似功能函数有几十、上百个的时候,我们需要给这些函数同一命名,程序员就可以省去记函数名的精力,把更多的精力和重点放在实现程序上。
更多详细信息请查看 作者信息