@@ -35,148 +35,3 @@ end program main
35
35
- 使用` => ` 可以为绑定的过程重命名。
36
36
- 被绑定的变量名尽量使用` this ` 或者` self ` (与其他语言的习惯相符)
37
37
38
- ## 函数重载
39
-
40
- 当定义的函数很多的时候,函数名会非常复杂,有时候我们希望可以简化,这时候,使用重载是一个选择。例如对于` vector ` 类型,我们希望它也可以通过传入一个数组来初始化。使用` generic ` 关键字就可以对函数进行重载
41
-
42
- ``` fortran
43
- module vector_mod
44
- implicit none
45
- type vector_t
46
- real,allocatable::x(:)
47
- contains
48
- generic::init=>vector_init,vector_init_array
49
- procedure,pass:: vector_init,vector_init_array
50
- end type vector_t
51
- contains
52
- subroutine vector_init(this,n)
53
- class(vector_t),intent(inout)::this
54
- integer,intent(in)::n
55
- allocate(this%x(n))
56
- end subroutine vector_init
57
-
58
- subroutine vector_init_array(this,a)
59
- class(vector_t),intent(inout)::this
60
- real,intent(in)::a(:)
61
- allocate(this%x,source=a)
62
- end subroutine vector_init_array
63
- end module vector_mod
64
-
65
- program main
66
- use vector_mod
67
- implicit none
68
- type(vector_t)::v
69
- type(vector_t)::va
70
- call v%init(10)
71
- call va%init([real::1,2,3,4])
72
- end program main
73
- ```
74
- 此时使用两种方式均可以对其进行初始化。
75
-
76
- ## 运算符重载
77
-
78
- 有时候,我们也希望对内置的运算符进行重载,用来提高代码的一致性。例如我们有一个分数类型,它有` +-*/ ` 和` ** ` 的操作,但是如果使用过程绑定的函数则显得代码过于臃肿。此时就可以使用运算符重载
79
-
80
- ``` fortran
81
- module frac_mod
82
- implicit none
83
- type frac
84
- integer(8)::num!numerator
85
- integer(8)::den!denominator
86
- contains
87
- generic::operator(.reduce.)=>cancelling !也可以使用自定义运算符
88
- generic::operator(+)=>add,add_frac_num,add_num_frac
89
- !generic::operator(-)=>sub
90
- !generic::operator(*)=>mult
91
- !generic::operator(/)=>div
92
- !generic::operator(**)=>pow
93
- !
94
- procedure,pass ::add,add_frac_num
95
- procedure,pass(this)::add_num_frac
96
- procedure,pass ::cancelling
97
- !procedure,pass::sub
98
- !procedure,pass::mult
99
- !procedure,pass::divi
100
- end type
101
- contains
102
- elemental function cancelling(this)result(z)
103
- class(frac),intent(in)::this
104
- type(frac) ::z
105
- ! do something
106
- end function cancelling
107
-
108
- type(frac) elemental function add(this,y)result(z)
109
- class(frac),intent(in)::this,y
110
- z%num=this%num*y%den+y%num*this%den
111
- z%den=this%den*y%den
112
- end function add
113
-
114
- type(frac) elemental function add_frac_num(this,m)result(z)
115
- class(frac),intent(in)::this
116
- integer,intent(in) ::m
117
- z%num=this%num+this%den * m
118
- z%den=this%den
119
- end function add_frac_num
120
-
121
- type(frac) elemental function add_num_frac(m,this)result(z)
122
- class(frac),intent(in)::this
123
- integer,intent(in) ::m
124
- z%num=this%num+this%den * m
125
- z%den=this%den
126
- end function add_num_frac
127
- end module frac_mod
128
-
129
- program main
130
- use frac_mod
131
- implicit none
132
- type(frac)::x,y,z,w(2)
133
- x=frac(1,2)
134
- y=frac(2,3)
135
- w=[frac(1,4),frac(1,3)] !自定义类型数组初始化
136
- z=x+y
137
- write(*,*)z
138
- z=x+1
139
- write(*,*)z
140
- z=2+y
141
- write(*,*)z
142
- write(*,*)w+2 !也支持数组
143
- end program main
144
- ```
145
- - 除此之外,也可以对比较运算符进行重载,注意比较运算符中运算符和其对应的旧形式属于同一个函数,不能重载为不同的功能。
146
-
147
- ## 赋值运算符的重载
148
-
149
- 赋值的运算符具有特有的形式` assignment(=) `
150
-
151
- ``` fortran
152
- module string_mod
153
- implicit none
154
- type string
155
- character(:),allocatable::str
156
- contains
157
- generic::assignment(=)=>equal
158
- procedure,pass::equal
159
- end type string
160
- contains
161
- subroutine equal(this,s)
162
- class(string),intent(inout)::this
163
- character(len=*),intent(in)::s
164
- this%str=s
165
- end subroutine equal
166
- end module string_mod
167
-
168
- program main
169
- use string_mod
170
- implicit none
171
- type(string)::s
172
- s="123"
173
- !内置构造函数形式
174
- s=string("456")
175
- end program main
176
- ```
177
-
178
- ## 习题
179
- - 请你尝试补充完所有的运算符
180
- - 尝试加入` gcd ` 对分数进行约分,补充` .reduce. ` 函数
181
- - (附加题)完成分数类,并使用高斯消元法求解希尔伯特矩阵的行列式和逆矩阵
182
-
0 commit comments