当前位置:首页 » 编程软件 » 编译器是通过什么来区分重载

编译器是通过什么来区分重载

发布时间: 2023-10-11 04:12:57

1. 重写和重载的三点区别

重载(Overloading)和重写(Overriding)是java中两个比较重要的概念。但是对于新手来说也比较容易混淆。下面是我为大家准备的重写和重载的区别,希望大家喜欢!

重写和重载的区别一:定义

重载

简单说,就是函数或者 方法 有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

重写

重写指的是在Java的子类与父类中有两个名称、参数列表都相同的方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。

重写和重载的区别二:相关知识

关于重载和重写,你应该知道以下几点:

1、重载是一个编译期概念、重写是一个运行期间概念。

2、重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法。

3、重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法

4、因为在编译期已经确定调用哪个方法,所以重载并不是多态。而重写是多态。重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。(注:严格来说,重载是编译时多态,即静态多态。但是,Java中提到的多态,在不特别说明的情况下都指动态多态)

重写和重载的区别三:对比

重写的例子

下面是一个重写的例子,看完代码之后不妨猜测一下输出结果:

class Dog{

public void bark(){

System.out.println("woof ");

}

}

class Hound extends Dog{

public void sniff(){

System.out.println("sniff ");

}

public void bark(){

System.out.println("bowl");

}

}

public class OverridingTest{

public static void main(String [] args){

Dog dog = new Hound();

dog.bark();

}

}

输出结果:

bowl

上面的例子中,dog对象被定义为Dog类型。在编译期,编译器会检查Dog类中是否有可访问的bark()方法,只要其中包含bark()方法,那么就可以编译通过。在运行期,Hound对象被new出来,并赋值给dog变量,这时,JVM是明确的知道dog变量指向的其实是Hound对象的引用。所以,当dog调用bark()方法的时候,就会调用Hound类中定义的bark()方法。这就是所谓的动态多态性。

重写的条件

参数列表必须完全与被重写方法的相同;

返回类型必须完全与被重写方法的返回类型相同;

访问级别的限制性一定不能比被重写方法的强;

访问级别的限制性可以比被重写方法的弱;

重写方法一定不能抛出新的检查异常或比被重写的方法声明的检查异常更广泛的检查异常

重写的方法能够抛出更少或更有限的异常(也就是说,被重写的方法声明了异常,但重写的方法可以什么也不声明)

不能重写被标示为final的方法;

如果不能继承一个方法,则不能重写这个方法。

重载的例子

class Dog{

public void bark(){

System.out.println("woof ");

}

//overloading method

public void bark(int num){

for(int i=0; i

System.out.println("woof ");

}

}

上面的代码中,定义了两个bark方法,一个是没有参数的bark方法,另外一个是包含一个int类型参数的bark方法。在编译期,编译期可以根据方法签名(方法名和参数情况)情况确定哪个方法被调用。

重载的条件

被重载的方法必须改变参数列表;

被重载的方法可以改变返回类型;

被重载的方法可以改变访问修饰符;

被重载的方法可以声明新的或更广的检查异常;

方法能够在同一个类中或者在一个子类中被重载。

2. C++如何实现函数重载的,即C++编译系统如何区分不同的重载函数

编译之后,同名的函数会根据其参数的不同等对名字做处理
比如说
int num() - > num@xxyy
int num(int n) - > num@aabbcc
我只是举例子,实际上生成的符号可能有所区别,但是c++的编译器就是这么处理重载的,你使用vc自带的mpbin可以查看dll的导出符号,或者自己编写一个dll导出重载的函数,然后命令行
mpbin -exports XX.dll > a.txt
可以查看你的同名的函数被编译器分配了一个什么样的名称~~@符号之后的字符串肯定不同的,@前面的函数名是一样的~

不知道你清楚了没,不然我明天给你发一下我的截图,之前我做COM互操作研究了一下~~可以切磋下~~

3. java 重载和重写的区别

1.定义区别:

①重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。

②覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。

2.类的关系区别

覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。

3.产生方法区别

覆盖只能由一个方法或只能由一对方法产生关系;重载是多个方法之间的关系。

4.参数列表要求区别

覆盖要求参数列表相同;重载要求参数列表不同。

5.调用方法区别

覆盖关系中,调用方法体是根据对象的类型来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。

(3)编译器是通过什么来区分重载扩展阅读

方法的重写:

1、在子类中可以根据需要对从基类中继承来的方法进行重写。

2、重写的方法和被重写的方法必须具有相同方法名称、参数列表和返回类型。(注:返回值可以为父类中返回值的子类型.参数若为子类,则不是重写是重载)

3、重写方法不能使用比被重写的方法更严格的访问权限。

4. 重写方法不能声明抛出比被重写方法范围更大的异常类型。

总结:重写是子类对所继承父类相同方法的一种更改,这个更改需要遵循格式按照父类的格式,访问权限,抛出异常等等,都在父类方法控制范围内,内部具体实现可以实现不同的效果。

4. C++语言的基本语法规则

C++语言的基本语法规则

C++是由AT&T Bell(贝尔)实验室的Bjarne Stroustrup博士及其同事于20世纪80年代初在C语言的基础上开发成功的。下面是我收集的C++语言的基本语法规则,希望大家认真阅读!

C++语法表达式规则的建立基础

C++ 中的布尔类型:布尔类型只占用一个bit ,但是如果连续定义多个布尔类型时,编译器可能会多个布尔类型定义在一起。true 编译器用1来表示。false 编译器用0来表示。

将一个其他类型的数据赋给布尔类型变量:C++编译器会将所有的非0的值转换为true(1),将0 转化为false(0)。

三木运算符 ? : :将一个三目运算符作为左值: (a>b?a:b) = 3 C语言不支持(三目运算符返回一个值),但在C++中支持(三目元算符返回变量)。 但是如果可能的返回值有一个是常量值,那么它就不能作为左值使用,如(a>b?1:b) = 3 非法。

引用:

C++中的引用:一个已经定义的变量的别名。 Type var , Type & name = var; 普通引用在声明时必须用其他的变量进行初始化。引用作为函数参数声明时不进行初始化。

const 修饰引用:const 使引用拥有只读属性,但是变量本身还是原来的属性。

当使用常量对const 引用进行初始化时,编译器会给常量分配空间,并将引用名命名为这段空间的别名。不能给普通引用赋值为常量,但是可以给常引用赋值为常量。此时常引用是只读的,除了在定义时,不能给它赋值。因此用一个常引用可以构成一个只读的变量,如 const int & a = 10 a是一个只读变量。

引用在C++ 的内部实现是一个常指针:type & name ßàtype* const name。因此引用拥有一个4字节的空间。

引用作为函数返回值:返回局部变量的引用时,引用不能作为左值,也不能用它初始化其他引用,但是如果引用时静态的或者全局变量的引用时就可以。

C++ 函数探幽:

内联函数:inline int function(…), 内联函数可以替代宏代码片段,在编译时将函数体直接替代函数被调用的'地方,这样就减少了普通函数被调用时 的开销(压栈,跳转等),但是内联函数本质上还是一个函数,不同于宏代码片段。内联函数声明符inline 必须要和函数定义结合在一起,不能放在声明处,否则编译器忽略内联请求。 虽然内联函数省时省空间,但是编译器不一定准许函数的内联请求,当C++编译器不允许内联请求时会将内联函数当做普通函数处理。

默认参数: C++中可以在函数声明时为参数提供一个默认值,当函数调用时没有提供这个参数的值,编译器会自动用默认值代替。但是在函数定义时就不在指定默认参数值。默认参数有如下规则:

只有参数列表后面的部分参数才可以提供默认参数值,一但在一个函数调用中开始使用默认参数,那么这个参数后的所有参数都必须使用默认参数,因此从开始使用默认参数的使用开始都后面的参数都要提供默认参数,否则编译器将报错。总之,在函数声明时,如果一个参数开始提供默认参数,那么后面的所有参数都要提供默认参数;在调用函数时,如果开始省略参数,那么后面所有参数都使用默认参数。

函数占位参数:占位参数是在函数定义时只有类型声明,没有参数名声明的参数。一般情况下函数体内部无法使用占位参数。但是在调用时必须提供完整的参数个数。可以给占位参数提供默认参数。意义:为函数的后续版本的扩展埋下伏笔;兼容C语言中的不规范写法。

函数重载:简单来说函数重载就是用同一个函数名来定义不同的函数。那编译器是如何区分这些函数的呢?事实上,编译器是通过参数列表来区分重载了的函数。即重载函数拥有不同的参数列表。不同的参数列表包括参数个数不同、参数类型不同、参数顺序不同,即满足上述三个条件之一就能构成重载函数。函数重载在构造函数中是非常有用的。

;
热点内容
安卓如何把手机短信导入电脑 发布:2024-11-18 11:32:44 浏览:297
如何天选2查看电脑配置 发布:2024-11-18 11:32:36 浏览:421
phpinclude目录 发布:2024-11-18 11:29:38 浏览:722
西门子hmi屏反编译软件 发布:2024-11-18 11:29:36 浏览:763
安卓机如何看微信撤回消息 发布:2024-11-18 11:25:08 浏览:570
解压循环动画创意c4d 发布:2024-11-18 11:20:20 浏览:932
phpcurlcookie 发布:2024-11-18 11:20:10 浏览:78
橙子生存之旅服务器ip 发布:2024-11-18 11:17:23 浏览:812
mysql密码如何修改 发布:2024-11-18 11:11:06 浏览:424
php背景代码 发布:2024-11-18 10:49:54 浏览:457