Fortran 2003的新特性 –终结例程 Final subroutines

来源:互联网 发布:xp系统连网络打印机 编辑:程序博客网 时间:2024/05/16 06:19
 

Intel Fortran Composer XE 2011中增加了对新一代Fortran标准中很多新特性的支持,其中包括了Fortran 2003中引入的面向对象的Fortran特性。在新标准中,我们可以通过在派生类型的定义中使用类型绑定过程(Type-bound procedures)把传统的数据结构定义与相关的操作封装起来,就象在C++中定义对象和成员函数一样。考虑下面的例子:

 

TYPE MY_TYPE

...   ! Component declarations

CONTAINS

  PROCEDURE :: PROC1 => MY_PROC

  PROCEDURE :: PROC2

END TYPE MY_TYPE

 

这里定义了一个派生类型MY_TYPE和与其相关的两个操作例程PROC1和PROC2. 其中PROC1又和真正实现算法的过程MY_PROC进行了绑定。类型绑定过程的调用方式也很简单,类似于传统的类型数据成员引用:

 

CALL B%PROC1

 

和C++中的析构函数类似,Fortran中的类型绑定过程中也包含一类特殊的过程 – 终结例程(Final subroutines)。终结例程主要用在对象被终结时完成相应的资源释放和清理操作,其定义方式为:

 

FINAL [ :: ] sub1 [, sub2]...

 

这里sub1,sub2等为终结例程,该例程只能且必须有一个类型为所属派生类型的参数,该参数不能是INTENT(OUT),optional,以及pointer或allocatable。如果参数为数组类型那么其形状和长度必须为假定。

 

例如下面的程序:

 

module module_Test

private

public :: type_Test

 

type :: type_Test

private

contains

final :: dispose0, dispose1, dispose2

end type

 

contains

 

subroutine foo(this)

class(type_Test)::this

write(*,*) "In type_test foo"

end subroutine

 

subroutine dispose0(this)

type(type_Test):: this

write(*,*) "I am disposed!"

end subroutine

 

subroutine dispose1(this)

type(type_Test)::this(:)

write(*,*) "We are disposed!"

end subroutine

 

subroutine dispose2(this)

type(type_Test)::this(:,:)

write(*,*) "All are disposed!"

end subroutine

end module

 

program main

use module_test

type(type_Test) , pointer :: a

type(type_Test) , pointer :: b(:)

type(type_Test) , pointer :: c(:,:)

 

allocate(a)

deallocate(a)

allocate(b(10))

deallocate(b)

allocate(c(10,10))

deallocate(c)

end

 

它的输出结果会是什么呢?

原创粉丝点击