面向对象编程,我的思想-6

      转载内容 2004-9-9 18:56
面向对象编程,我的思想
作者:韩景维  时间:2004-9-8  文档类型:原创  来自:相关论坛
浏览统计 year:702 | Quarter:702 | Month:702 | Week:702 | today:674

第 1 页 类与对象的初探
第 2 页 内置数据类型与函数
第 3 页 深入探讨面向对象
第 4 页 一起来看看workstation这个类
第 5 页 构造函数、默认构造函数、 缺省构造函数
第 6 页 重载构造函数
第 7 页 初始化与赋值




  2.3.2重载构造函数:

  我还是先把概念给你吧,让你有个认识,随后我们在进行论述。

  在JAVA中:

  1. 函数重载是一个类中声明了多个同名的方法,但有不同的参数个数和参数类型。

  2. 函数重构是指在子类中声明与父类同名的方法,从而覆盖了父类的方法。重构解决了子类与父类的差异问题。(在讨论到继承时我会详细说明)

  在C++中:

  1. 数重载的概念一样。

  2. 重构的概念可就不一样了,C++中功能更为庞大的虚函数。更详细内容这里就不错过多介绍了!

  其实关于重载的概念你并不陌生,在编程中相信你也接触过。呵呵!让我们来举个操作符重载的例子你就会明白了,(JAVA中不支持这个功能)我们定义三个整数变量:

  int i1=2, i2=3,i3=0;
  
  i3 = i1 + i2;
  
  此时i3=5;加号实现了两个数相加的运算功能。然而我们现在要定义三个字符串变量:
  
  String str1=”jing”, str2=”wei”,str3=””;
  
  str3 = str1 + str2;

  此时str3 = “jingwei”;加号实现了两个字符串相加的运算功能。同样是加号,既可以把两个整型的变量加在一起,也可以把两个字符串类型的变量加在一起。同一个操作符实现了不同的功能------这就是所谓的操作符重载(嘿嘿,我说你一定见过吧:)!不就好像是汉语中的一词多意一样!我需要说明一下的是,C++中的操作符重载可没有这么简单。比如,我们可以对两个自定义类型的对象进行相加的运算,进行赋值的运算。这样书写简洁明了,而且非常实用。当然,关于操作符重载的话题太多了,有兴趣再看看书吧!

  我们把操作符的话题在转到函数上来,我们一直强调的是“对象调方法”------对象其实调的是方法的“名称”。而我们现在要对方法进想重载,也就是定义多个相同名称的函数,这样计算机在调用的时候不会混淆嘛?我想应该不会的,呵呵,因为仅仅是函数名称相同,而我们在调用函数时会把参数传递给他的。既是没有参数也是一种参数传递参数的信息(信息为无参数)!然而由于参数类型、参数数量、返回值类型不同我们就可以对相同名称的函数进行区分了!目的只有一个,用简便的方法实现更多的功能。还是举个例子吧,重载构造函数!


  public class employee{
  
  public employee(String n,int a,char s,float e,boolean l){ //看这个构造函数
  
  name = n; //设置员工姓名
  
  age = a; //设置员工年龄
  
  sex = s; //设置员工性别
  
  emolument = e; //设置员工薪水
  
  lunch =l; //设置员工午餐
  
  }
  
  public employee(){ //请注意这个函数没有参数
  
  name = “jw”;
  
  age = 20;
  
  sex = ’W’;
  
  emolument = 99;
  
  lunch = true
  
  }
  
  //……等等
  
  };




  看,在一个类中有两个名称相同的函数,可我们在使用的时候系统如何知道我们调用的是那个版本的函数呢?呵呵,我刚刚说过了,可以通过函数的参数类型、参数数量、返回值类型来确定。现在我们接着试验,我们创建两个对象其中的一个调用带参数的构造函数,第二个对象调用缺省值的构造函数。我们来看看结果:

  jingwei = new employee("jingwei",20,'M',100,false);/*创建这个对象的时候调用的是带参数的构造函数*/
  
  flashmagic = new employee();//创建这个对象是调用的是却省值的构造函数
  
  而得到的结果呢?让我们一起来看一看!
  
  Jingwei这个对象中: flashmagic这个对象中:

  name jingwei name jw




  age 20 age 20
  
  sex M sex W
  
  emolument 100 emolument 99
  
  lunch false lunch true



  看,虽然是两个名称完全相同的函数,但完成了不同的工作内容。呵呵!关于函数重载我们就料到这里吧,我相信你已经有个大印象了,而更详细的内容仍需要你的努力!

  重载普通的函数与重载构造函数大同小异,不过他多了一个this指针!this一般是对当前对象的引用。这么说吧,如果涉及到两个以上的对象时就会使用this指针。每个成员函数都有一个this指针,它是一个隐藏的参数,this指针只向调用它的对象!我说过方法只有一份,而对象都有自己的属性,当对象调用方法来先是属性的时候,他怎么来判断调用的时不是自己的属性呢?这就需要this指针来大显神威了。

  关于拷贝构造函数、内联函数、虚函数、模版等欧就不做过多的讨论了,因为JAVA中好像没有这些了。不过我需要提醒你一下的是,在C++中,类内定义的函数自动转换为内联函数,而这好像与我前面提到的思想有冲突。因为内联函数的目的是减少函数调用的开销!呵呵!我也没绕出来呢!还请哪为大虾指点一二!谢!


标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}