类型
用途
TYPE 类型声明语句指定派生类型的对象和函数的类型,类型参数和属性。 可以为对象赋予初始值。
类型声明语句可以声明派生类型和固有类型的实体。 TYPE类型声明语句可以声明派生类型和固有类型的实体。 
语法
规则
- 如果 => 出现在组件初始化中,那么 POINTER 属性必须出现在 attr_spec_list中。
- 如果 = 出现在组件初始化中,那么 POINTER 属性无法出现在组件 attr_spec_list中。
- 编译器将在类型定义的作用域单元内对 constant_expr 求值。
如果变量出现 => ,那么对象必须具有 POINTER 属性。
如果针对变量显示 constant_expr ,那么对象不能具有 POINTER 属性。
类型声明语句中的实体会受到对实体指定的任何属性规则的约束,如对应的属性语句中所详述。
一旦定义了派生类型,您就可以使用它通过 TYPE 类型声明语句来定义数据项。 当实体被显式声明为派生类型时,该派生类型必须先前已在作用域单元中定义,或可通过使用或主机关联进行访问。
数据对象变为派生类型的对象或结构。 每个结构组件都是派生类型对象的子对象。
如果指定 DIMENSION 属性,那么将创建其元素具有该派生类型的数据类型的数组。
除了在规范语句中,您可以将派生类型的对象用作实际参数和哑参数,并且这些对象也可以显示为输入/输出列表中的项 (除非该对象具有具有 POINTER 属性的组件) ,赋值语句,结构构造函数以及语句函数定义的右侧。 如果结构组件不可访问,那么派生类型对象不能在输入/输出列表中使用,也不能用作结构构造函数。
非序列派生类型的对象不能用作 EQUIVALENCE 和 COMMON 语句中的数据项。 非序列数据类型的对象不能是整数所指对象。
非序列派生类型哑参数必须指定一个可通过使用或主机关联来访问的派生类型,以确保同一派生类型定义同时定义实际自变量和哑参数。
类型声明语句将覆盖正在生效的隐式类型规则。
如果对象是哑参数、可分配对象、函数结果、空白公共块中的对象、整数指针、外部名称、固有名称或自动对象,那么不能在类型声明语句中初始化对象。 如果对象具有 AUTOMATIC 属性,那么也无法初始化该对象。 如果对象出现在块数据程序单元
中的命名公共块中,或者出现在模块或子模块
中的命名公共块中,则可以对它进行初始化。
在 Fortran 95 中,可以初始化指针。 只能通过使用 => NULL()来初始化指针。
如果规范表达式出现在接口主体或子程序的规范部分中,那么 array_spec 的规范表达式可以是非常量表达式。 任何使用此非常量表达式且不是哑参数或所指对象的被声明对象都称为自动对象。
属性不能在给定类型声明语句中重复,并且在一个作用域单元中,一个实体不能被多次显式赋予同一个属性。
如果语句包含 PARAMETER 属性,那么必须指定 constant_expr 。 如果要声明的实体是变量,并且指定了 constant_expr 或 NULL() ,那么初始定义该变量。
如果要声明的实体是派生类型组件,并且指定了 constant_expr 或 NULL() ,那么派生类型具有缺省初始化。
a 将根据固有赋值规则,通过 constant_expr 确定的值进行定义。 如果实体是数组,那么其形状必须在类型声明语句中指定,或在同一作用域单元中的先前规范语句中指定。 变量或变量子对象最多只能初始化一次。 如果 a 是变量,那么存在 constant_expr 或 NULL() 意味着 a 是已保存的对象 (指定公共块中的对象除外)。 对象的初始化可能会影响对象的基本存储类。
entity_decl 中指定的 array_spec 优先于 DIMENSION 属性中的 array_spec 。
没有 ALLOCTABLE 或 POINTER 属性的数组函数结果必须具有显式形状数组规范。
如果声明的实体是函数,那么除非它是固有函数,否则不得具有可访问的显式接口。 可以在 FUNCTION 语句上指定派生类型,前提是派生类型在函数主体中定义,或者可通过主机或使用关联进行访问。
如果 或 (之前定义为常量名称)出现在类型声明语句中,它不再是简写的逻辑常量,而是已命名常量的名称。 T F 
示例 1
以下代码使用 TYPE 类型声明语句定义派生类型people 。TYPE people
INTEGER age
CHARACTER*20 name
END TYPE people
people的名为 smith 的实体:TYPE(people) :: smith = people(25,'John Smith')

示例 2
TYPE(INTEGER) :: i
TYPE(INTEGER(KIND=2)) :: i2
TYPE(INTEGER(4)) :: i4
TYPE(CHARACTER(*)) :: cstar
TYPE(CHARACTER*2) :: c2
TYPE(CHARACTER(LEN=4,KIND=1)) :: c4
TYPE(CHARACTER(7)) :: c7
TYPE derived(l)
TYPE(INTEGER), LEN :: l
TYPE(CHARACTER*l) :: cl
TYPE(COMPLEX), DIMENSION (l) :: cp
END TYPE derived


派生类型不能是抽象的。 