• 学前教育
  • 小学学习
  • 初中学习
  • 高中学习
  • 语文学习
  • 数学学习
  • 英语学习
  • 作文范文
  • 文科资料
  • 理科资料
  • 文档大全
  • 当前位置: 雅意学习网 > 初中学习 > 正文

    C 函数重载【Fortran,90模拟C++函数重载】

    时间:2020-03-07 09:48:38 来源:雅意学习网 本文已影响 雅意学习网手机站

      摘 要: 函数重载是C++语言多态性的重要体现,也是面向对象程序设计的常用方法,Fortran 90不支持面向对象程序设计,但已经具有一些现代语言特征,为模拟面向对象程序设计提供可能,在分析C++函数重载机制的基础上,通过对Fortran 90相关语言元素、工具的探索,提出利用Fortran 90新增加的接口块这一利器模拟C++函数重载的方法,实例运行结果表明,该方法现实可行,从而扩展Fortran 90的应用范围,并为模拟面向对象程序设计提供思路。
      关键词: Fortran 90;接口块;C++;面向对象程序设计;函数重载
      中图分类号:TP314 文献标识码:A 文章编号:1671-7597(2011)1210193-02
      0 引言
      面向对象方法更加符合人类思维习惯,在软件开发中被公认为是能够提高代码重用性和可维护性的有效方法。C++支持面向对象程序设计,其函数重载机制可以提高程序设计的可读性和灵活性,是面向对象程序设计的一个常用方法。
      Fortran语言是最早诞生的高级语言,广泛应用于科学与工程计算领域。与Fortran 77相比,Fortran 90增加了模块、自定义类型、指针、接口块等新工具[1],使其具有了一些现代语言特征,但仍是面向过程的编程语言,不直接支持函数重载等面向对象程序设计[2]。
      本文利用Fortran 90新提供的接口块等工具,对C++函数重载进行模拟,并通过实例进行验证。C++开发环境为Visual C++ 6.0,Fortran 90开发环境为Compaq Visual Fortran 6.6。
      1 函数重载
      1.1 函数重载现象
      数学上求一个数的绝对值,这个数既可以是整数也可以是实数,所调用的是同一个函数。假如用C语言编写一个求绝对值的函数,由于参数的数据类型不同,需要定义两个不同名称的函数,分别对整数和实数进行求值:
      Int iabs(int);float fabs(float);
      尽管这两个函数都是实现求绝对值的功能,函数名称却不同,这与人们的日常思维习惯不符,给程序设计人员记忆和使用函数带来不便。针对此类问题,C++则通过函数重载来解决[3]。函数重载是指在同一作用域内,用相同的函数名对应不同的函数实现,这些不同实现的同名函数称为重载函数。例如,C++可以将求绝对值的函数定义成一组函数名相同的重载函数:
      int abs(int);float abs(float);
      在调用程序中,由C++编译器根据实参和形参的匹配,自动选择调用哪一个重载函数。被重载的函数须同时满足以下条件:
      1)要有两个或两个以上,且在同一作用域内;
      2)实现的功能必须相同,函数名必须相同;
      3)至少要在参数类型、参数个数或参数顺序上有所不同,即参数表不同。
      C++函数重载包括类成员函数重载和普通函数重载,二者在本质上是相同的,都是函数名相同参数表不同。故此,本文以普通函数重载为例进行说明。
      值得注意的是:C/C++与Fortran同属编译型语言,其实现例程(函数和子程序统称为例程)的机制相同,Fortran有返回值的例程为函数(Function),无返回值的例程为子程序(Subroutine);C/C++中
      类型的函数无返回值,其它类型的函数有返回值,分别与Fortran中的子程序和函数对应。换言之,C++中的函数重载实际包括Fortran中的函数与子程序二种例程的重载。
      1.2 函数重载的实现
      在C++中,以交换两个整数和两个实数为例分析函数重载的实现。
      #include
      void swop(int & x, int & y) // 定义重载函数,参数以引用方式传递
      { int t; t = x; x = y; y = t; }
      void swop(float & x, float & y) // 定义重载函数,参数以引用方式传递
      { float t; t = x; x = y; y = t; }
      void main( void ) // 主函数
      { int a = 3, b = 4; float c = 2.5, d = 6.9;
       swop(a, b); cout   在外部例程接口简单的情况下,调用程序中是否建立被调外部例程的接口块是可选的;但在下列情况下必须使用接口块[4]:
      1)外部例程具有可选参数;
      2)外部函数返回数组或变长字符串;
      3)外部例程具有假定形状数组、指针或目标参数;
      4)例程做参数。
      接口块的构造形式为:
       Interface
       接口体
       End Interface
      当中的接口体,类似于C/C++中的函数原型声明,只包括外部例程的接口信息。通常,接口块位于调用程序的声明区。
      探索中发现,当接口块只声明一个外部例程原型时,若给接口块命名,则在调用程序中可以用接口块名代替外部例程名进行调用;当接口块中声明两个或两个以上外部例程原型时,还能否用接口块名代替外部例程名,依据参数表匹配的原则,选择调用合适的外部例程呢?如果这种设想成立,就可以用Fortran 90模拟C++函数重载。
      2.2 实现模拟
      上述探讨的Fortran 90接口块,主要针对的是外部例程,通过在调用程序中建立其接口块,明确其接口信息,来产生正确的调用。若将外部例程置于模块(Module),则外部例程就转化为模块例程。因此,例程重载分外部例程重载和模块例程重载二种。
      2.2.1 外部例程重载
      以交换两个整数和两个实数的重载为例,重载的外部例程实现分别为:
      Subroutine SwopInteger (x, y)
       Integer temp, x, y
      temp = x; x = y; y = temp
      End Subroutine
      Subroutine SwopReal (x, y)
       Real temp, x, y
      Temp = x; x = y; y = temp
      End Subroutine
      在调用程序的声明区建立如下的接口块:
       Interface Swop ! 建立有名接口块
       Subroutine SwopInteger (x, y) ! 声明重载外部例程接口
       Integer x, y
       End Subroutine
       Subroutine SwopReal (x, y) ! 声明重载外部例程接口
       Real x, y
       End Subroutine
       End Interface
      这样,就可以用统一的形式Call Swop(a,b)分别调用两个不同的外部例程:当实参a和b为整型时,调用的是SwopInteger外部例程;当实参a和b为实型时,则调用的是SwopReal外部例程。从而,成功地模拟了C++函数重载机制。
      2.2.2 模块例程重载
      将上述二个外部例程置于模块,转化为模块例程(Module procedure):
      Module MyMod ! 模块程序单元
       Implicit None
       Contains
       Subroutine SwopInteger (x, y) ! 重载的模块例程
       ……
       Subroutine SwopReal (x, y) ! 重载的模块例程
       ……
      End Module
      由于模块的缺省访问属性为Public,所以一旦调用程序引用(Use)了模块,模块中包括模块例程在内的实体在调用程序中就是可见的,模块例程就如同调用程序的内部例程,其接口是自显的[5]。所以,建立模块例程重载的接口块可以只列出重载的模块例程:
       Interface Swop ! 定义模块例程重载接口块
       Module procedure SwopInteger, SwopReal
       End Interface
      正因为模块的缺省访问属性为Public,所以模块例程重载的接口块既可以置于模块的声明区,也可以置于引用模块的调用程序的声明区。程序运行结果表明,模块例程同样可以被重载。
      3 结语
      Fortran 90不支持面向对象程序设计,但具备了一些现代语言特征,本文正是利用其提供的接口块这一利器,对C++函数重载进行了成功模拟,给出了外部例程和模块例程两种重载方法,为Fortran 90的应用扩展积累了经验。
      
      参考文献:
      [1]ISO/IEC 1593-1:1991,Fortran 90[S].
      [2]周振红、余明辉、张成才等,Fortran 90模拟C++主要面向对象特性[J].武汉大学学报(工学版),2006,39(2):42-46.
      [3]吕凤翥,C++语言程序设计[M].北京:电子工业出版社,2006:113-114.
      [4]周振红、郭恒亮、张君静等,Fortran 90/95高级程序设计[M].郑州:黄河水利出版社,2005:28-29.
      [5]任慧、周振红,Fortran与C/C++共享模块中的数据和例程[J].郑州大学学报(工学版),2008,29(1):99-101.
      
      
      Fortran 90 emulating C++ function overloading
      JIN Kaiguan, ZHOU Zhenhong
      (School of Hydraulic & Environmental Engineering,Zhengzhou University,Zhengzhou 450001,China)
      
      Abstract: Function overloading is an important embodiment of polymorphism in C++, and a kind of common use for object-oriented programming. Fortran 90 does not support object-oriented programming, but possesses some features of modern computer languages which make it possible to emulate object-oriented programming. With the exploration of some related language elements and tools of Fortran 90, it is put forward that the function overloading mechanism can be emulated indirectly with the new powerful tool of interfaces on the basis of analyzing C++ function overloading. The examples have proved that this method is workable so as to extend the applicable areas of Fortran 90, and provide some ideas to emulate object-oriented programming.
      Key words: Fortran 90;interface;C++;object-oriented programming;function overloading
      
      作者简介:
      靳开冠(1986-),男,河南原阳人,硕士研究生,郑州大学,研究方向:水利信息技术。

    推荐访问:重载 函数 模拟 Fortran 90模拟C++函数重载 内联函数 运算符重载

    • 文档大全
    • 故事大全
    • 优美句子
    • 范文
    • 美文
    • 散文
    • 小说文章