重载函数

重写和重载

*爱你&永不变心* 提交于 2020-01-13 22:56:20
重载(Overloading) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。 重载Overloading是一个类中多态性的一种表现。 Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。 父类方法被默认修饰时,只能在同一包中,被其子类被重写,如果不在同一包则不能重写。 父类的方法被protoeted时,不仅在同一包中,被其子类被重写,还可以不同包的子类重写。 重写方法的规则: 1)、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。 2)、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。 3)、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private) 4)、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如: 父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception

Java重写与重载

混江龙づ霸主 提交于 2020-01-11 14:55:18
一、重写 (Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。 在面向对象原则里,重写意味着可以重写任何现有方法。 方法的重写规则: 参数列表必须完全与被重写方法的相同。 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。 父类的成员方法只能被它的子类重写。 声明为 final 的方法不能被重写。 声明为 static 的方法不能被重写,但是能够被再次声明。 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。

操作符重载的概念

眉间皱痕 提交于 2020-01-10 16:09:44
请看程序: 1 #include <stdio.h> 2 class Complex 3 { 4 int a; 5 int b; 6 public: 7 Complex(int a,int b) 8 { 9 this->a = a; 10 this->b = b 11 } 12 friend Complex Add(const Complex&p1,const Complex&p2); 13 }; 14 Complex Add(const Complex&p1,const Complex&p2) 15 { 16 Complex ret; 17 ret.a = p1.a + p2.a; 18 ret.b = p1.b + p2.b; 19 20 return ret; 21 } 22 int main() 23 { 24 Complex c1(1,2); 25 Complex c2(3,4); 26 Complex c3 = Add(c1,c2); 27 printf("c3.a = %d,c3.b = %d\n",c3.a,c3.b); 28 return 0; 29 } 思考一个问题,在以上程序中,Add函数可以解决Complex对象相加的问题,但是Complex是现实世界中确实存在的复数,并且复数在数学中的地位和普通的实数相同,那为什么不能让 + 操作符也支持复数相加呢??

函数对象 (伪函数)

一曲冷凌霜 提交于 2020-01-10 04:36:55
尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象。函数对象(也称“算符”)是重载了“()”操作符的普通类对象。因此从语法上讲,函数对象与普通的函数行为类似。 用函数对象代替函数指针有几个优点: 1>首先,因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。 2>函数对象也具备有存储先前调用结果的数据成员。 在使用普通函数时需要将先前调用的结果存储在全程或者本地静态变量中,但是全程或者本地静态变量有某些我们不愿意看到的缺陷。 3>其次,在函数对象中编译器能实现内联调用,从而更进一步增强了性能。这在函数指针中几乎是不可能实现的。 下面举例说明如何定义和使用函数对象。首先,声明一个普通的类并重载“()”操作符: class Square { public: int operator() (int n) { return n * n; } }; 重载操作语句中,记住第一个圆括弧总是空的,因为它代表重载的操作符名;第二个圆括弧是参数列表。一般在重载操作符时,参数数量是固定的,而重载“()”操作符时有所不同,它可以有任意多个参数。 因为在Square中内建的操作是一元的(只有一个操作数),重载的“()”操作符也只有一个参数。返回类型与参数类型相同-本例中为int。函数返回的是实参平方的整数。 使用函数对象 Square

面向对象的三个基本特征

被刻印的时光 ゝ 提交于 2020-01-10 03:52:38
面向对象的三个基本特征是: 封装、继承、多态 1. 封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 2. 继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。 继承概念的实现方式有三类:实现继承、接口继承和可视继承。 Ø 实现继承是指使用基类的属性和方法而无需额外编码的能力; Ø 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力; Ø 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。 在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承

C#重载和继承混用会怎样?

耗尽温柔 提交于 2020-01-07 22:06:50
C#重载和继承混用会怎样? OverLoad就是重载,大家都会。但是大家有没有想过,我们调用一个重载方法的时候会调用哪个呢?? 答案是和签名最接近的一个。 大家是不是看到这里已经开始觉得这个博客很无聊了,都是这么简单的内容。没关系,我们慢慢深入。 我们知道方法为了能够减少书写个数, 提供了一个叫默认参数的东西 void P ( object p1 , bool p2 = true ) { } 这样我们可以通过 P(p1) 或者 P(p1true) 两种方式来进行调用 如果我们这个时候的重载情况时这样的 void P ( object p1 ) { Console . WriteLine ( "第一个" ) ; } void P ( object p1 , bool p2 = true ) { Console . WriteLine ( "第二个" ) ; } 此时再调用, P(p1) 执行的是上一个函数。一种理解方式是,第二个方法比第一个能够多处理一种情况 P(p1,true) 。所以我们专事专用,选择更具体的方法。 ok.C#作为一个OO语言,还有一个特点就是继承,这个同样反映在方法里 void P ( object p1 ) { } 对于上述方法,可以使用 object 作为参数,也可以使用更加具体的 object 子类 那么如果我们的重载情况时这样的 void P (

[03]java中的方法以及控制语句

巧了我就是萌 提交于 2020-01-07 20:41:15
00 Java中的语句块 语句块(有时叫做复合语句),是用花括号扩起的任意数量的简单Java语句。块确定了局部变量的作用域。块中的程序代码,作为一个整体,是要被一起执行的。块可以被嵌套在另一个块中,但是不能在两个嵌套的块内声明同名的变量。语句块可以使用外部的变量,而外部不能使用语句块中定义的变量,因为语句块中定义的变量作用域只限于语句块。 代码中的语句: public class Test19 { public static void main(String[] args) { int n; int a; { int k; int n; //编译错误:不能重复定义变量n } //变量k的作用域到此为止 } } 每个方块就代表一个语句块,从中可以看出语句块的范围以及关系 01 Java中的方法 方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数。 [修饰符1 修饰符2 …] 返回值类型 方法名(形式参数列表){ Java语句;… … … } 方法用于定义该类或该类的实例的行为特征和功能实现。 方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。 方法的调用方式: 对象名.方法名(实参列表) 方法的详细说明 形式参数

重写、重载、隐藏的区别

久未见 提交于 2020-01-07 14:14:33
重载: 指的是同意可访问区被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数。重载不关心函数返回类型。 class A { public: void test{int i}; //overload void test(double i); //overload void test(int i, double j); //overload void test(double i, int j); //overload int test(int i); //not overload }; 隐藏: 是指派生类的函数屏蔽了与其同名的基类函数。注意只要是同名函数,不管参数列表是否相同,基类函数都会被隐藏。 #include<iostream> using namespace std; class Base { public: void fun(double, int) { cout << "Base::fun(double, int)" << endl; } }; class Derive:public Base { public: void fun(int) { cout << "Derive::fun(int)" << endl; } }; int main() { Derive pd; pd.fun(1); //pd.fun(0.01, 1)

C++ Primer 有感(重载操作符)

这一生的挚爱 提交于 2020-01-05 10:21:37
1.用于内置类型的操作符,其含义不能改变。也不能为任何内置类型定义额外的新的操作符。(重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义) 2.重载操作符,操作符的优先级、结合性或操作数数目不能改变。 注意:重载操作符时使用默认实参是非法的 。 3.重载操作符并不保证操作数的求值顺序,不再具备短路求值特性。 4.作为类成员的重载函数,其形参看起来比操作数数目少1。作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。( 重载一元操作符如果作为成员函数就没有(显式)形参,如果作为非成员函数就有一个形参。类似的,重载二元操作符定义为成员时有一个形参,定义为非成员函数时有两个形参 ) 5.重载逗号、取地址、逻辑与、逻辑或等操作符通常不是好做法。这些操作符具有有用的内置含义,如果我们定义了自己的版本,就不能再使用这些内置含义。 6. 将要用作关联容器键类型的类定义<操作符。关联容器默认使用键类型的<操作符。即使该类型将只存储在顺序容器中,类通常也应该定义相等(==)操作符和小于(<)操作符,理由是许多算法假定这些操作符存在。如果类定义了相等操作符,它也应该定义不等操作符!=。 7.为类设计存在操作符的时候,是将操作符设置为类成员还是普通黑成员函数。下面是一些指导原则

C++ Primer 有感(重载操作符)

这一生的挚爱 提交于 2020-01-05 10:21:17
1.用于内置类型的操作符,其含义不能改变。也不能为任何内置类型定义额外的新的操作符。(重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义) 2.重载操作符,操作符的优先级、结合性或操作数数目不能改变。 注意:重载操作符时使用默认实参是非法的 。 3.重载操作符并不保证操作数的求值顺序,不再具备短路求值特性。 4.作为类成员的重载函数,其形参看起来比操作数数目少1。作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。( 重载一元操作符如果作为成员函数就没有(显式)形参,如果作为非成员函数就有一个形参。类似的,重载二元操作符定义为成员时有一个形参,定义为非成员函数时有两个形参 ) 5.重载逗号、取地址、逻辑与、逻辑或等操作符通常不是好做法。这些操作符具有有用的内置含义,如果我们定义了自己的版本,就不能再使用这些内置含义。 6. 将要用作关联容器键类型的类定义<操作符。关联容器默认使用键类型的<操作符。即使该类型将只存储在顺序容器中,类通常也应该定义相等(==)操作符和小于(<)操作符,理由是许多算法假定这些操作符存在。如果类定义了相等操作符,它也应该定义不等操作符!=。 7.为类设计存在操作符的时候,是将操作符设置为类成员还是普通黑成员函数。下面是一些指导原则