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
它的输出结果会是什么呢?