当前位置:在线查询网 > 在线百科全书查询 > 重载

重载_在线百科全书查询


请输入要查询的词条内容:

重载


重载,在一个类定义中,可以编写几个同名的方法,但是只要它们的签名参数列表不同,Java就会将它们看做唯一的方法。简单的说,一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法。



简介


重载是可使函数、运算符等处理不同类型数据或接受不同个数的参数的一种方法

重载是不是多态?


第一种说法

重载是一种是多态(如C++),有四种形式的多态:

1.虚函数多态

2模板多态

3重载

4转换

所谓的动态和静态区分是另一种基于绑定时间的多态分类,严格来说,重载是编译时多态,即静态多态,根据不同类型函数编译时会产生不同的名字如int_foo和char_foo等等,以此来区别调用。故重载仍符合多态定义——通过单一标识支持不同特定行为的能力,只是重载属于静态多态,而不是通过继承和虚函数实现的动态多态。

第二种说法

重载(overload)和多态无关,真正和多态相关的是覆盖(override)。

当派生类重新定义了基类的虚拟方法后,基类根据赋给它的不同的派生类引用,动态地调用属于派生类的对应方法,这样的方法调用在编译期间是无法确定的。因此,这样的方法地址是在运行期绑定的(动态绑定)。

重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。

不过针对所谓的第二种重载,有一个专门的名词--重写或重定义。重载与重写的区别就在于是否覆盖,重写一般多发生在不同的类且存在继承关系之间,而重载多是在一个类里或者一块代码段里。

详细解读


函数重载

1.》》函数名必须相同,返回值可以相同,也可以不同,但是特征标必须不同。是函数名来确定函数的不同,是特征标是函数可以重载。编译器首先选在函数名,然后再根据特征标在众多重载的函数中找到合适的。

2.》》匹配函数时,编译器将不区分类型引用和类型本身,也不区分const和非const变量。(小注:因为这些在定义和声明时可能不同,但是在调用时都是一样的,编译器将无法区分)

3.》》名称修饰(name decoration)。编译器将根据原型中指定的形参对每个函数名进行加密。

重载与重定义

被重载的函数有不同版本,这些函数地位是一样的,可以根据特征标的不同选择不同的函数。被重定义的函数也有不同的版本,但是你不能随意选择,你只能选择最新的版本,被重定义多发生在类之间的继承里。

4.》》函数会有那么多版本,那么编译将选哪一个呢。当然,理想情况是,实参与形参的数据类型完全匹配,但是当不完全匹配时会怎样呢?这就要牵扯到c++里复杂的类型转换了。

在重载及函数模板重载里,编译器选择函数,要经过以下三步,这个过程称为重载解析。

第一步:创建候选函数列表,其中包含有与被调函数名称相同的函数与模板函数。

第二步:使用候选函数列表创建可行函数列表。这些都是参数数目正确的函数。

第三步:确定是否有最佳可行的函数。如果有,则使用。

确定最佳函数,只考虑其特征标,而不考虑返回类型(也无从考虑,但是要是硬想办法的话,也有,不过没有必要为了不必要的性能而浪费资源)。确定最佳函数,匹配特征标要依次经过以下判断:(1)完全匹配(常规函数优于模板;允许无关紧要的转换)(2)提升匹配(如char和short自动转换为int)(3)标准转换(int转换为char,long转换为double)(4)用户自定义的转换(如类声明中定义的转换函数)。

完全允许无关紧要的转换,这些转换包括引用,指针与实体之间,数组与指针之间,函数与函数指针之间,const与非const等等。

其次还要注意还要注意匹配的优先级。1,指向非const数据的指针和引用优先于const的指针和引用参数匹配(这种优先级只有当指针或引用出现时产生)。2,非模板函数,优于模板函数,显示具体化的模板将优于隐式具体化的模板,总之较具体的优先(注意,具体并不是由于显隐决定的,术语“最具体”是指编译器推断使用哪种类型时执行的转换最少)。

C++中的重载

函数重载:

函数重载就是函数名称相同,但定义却不同。函数重载使得程序员可以将一系列的函数族定义为一个统一的界面,但是却可以处理不同类型数据或接受不同个数的参数。这实现了统一接口,不同定义的思想。

流的重载:

C++的流提取运算符>>和就插入运算符<<是C++类库提供的输入输出(I/O)操作符。系统与定义了输入流类istream和输出流类ostream,cin和cout分别是istream和ostream的对象。iostream头文件中已经对>>和<<进行了重载,使得它能用来输入/输出标准类型的数据。但如果是自己定义类型,就需要重载在这两个运算符,以便它们能输入/上岁数出该自定义类型。格式如下:

流插入的重载:ostream &operator<<(ostream &,自定义类 &);

流提取的重载:istream &operator>>(istream &,自定义类 &);

运算符的重载:

运算符的重载就是对运算符的重新定义,即一个运算符可以用于多种数据类型的运算中。运算符的重载在实际编程中使用很普遍,例如,“+”运算符既可以用于整数加,也可以用于浮点加,甚至是字符串的链接。格式如下:

type operator sign (参数列表);

相关分词: 重载