第8講 関数の学習その2  
第3話 動的関数

#include<iostream>
using namespace std;
using namespace System;
void f();
int main(){
   f();
   f();
}
void f(){
   int i;
   i=2;
   cout<<i<<endl;
}

これが何故、ビルドエラーしないのでしょうか。

答えは、関数は生成消滅を繰り返すです。
関数は、mainあるいは他の関数からf();と呼び出されたときに誕生し、
任務が終了すると死滅するのです。
C言語の関数は、main(とこの後に説明する静的関数)を除いて生成消滅を繰り返すのです。
呼び出されたときに生成し、任務を遂行すると消滅してしまうのです。
ですから、2回目のf();でf生まれたとしても、fにとってははじめての生誕なのです。
つまり、いつでも関数は呼び出されたとき、自分でははじめて生まれたと思っているのです。
消滅したときに、一切の痕跡が消えるからです。

このように生成消滅を繰り返す関数を動的関数といいます。
そして、普通の関数はすべて動的関数です。

なぜ、関数は基本的には生成消滅を繰り返す動的関数なのでしょうか。
それはこちらの方が合理的であるからです。
関数が働いている場合、コンピュータはメモリーを食われます。
メモリーがないと関数にしても変数にしても生きられません。
変数を箱と比喩してきましたが、正確には値を収めるメモリー領域です。
変数を宣言すると、データを収納するメモリーが割り当てられるのです。
関数についても、起動するとメモリーが割り当てられます。

もし、使っていない変数や関数がメモリーに常駐するとなると、
これは明らかなメモリーの無駄遣いです。
だから、仕事が仕上がったら、消滅してくれる方が合理的です。

メモリーの中に関数や変数を常駐させたいときは、
static void f(){
     ・
}
static int i;
のようにstaticを付けます。
staticは静的という意味です。
したがって、staticのついた変数は静的変数、staticのついた関数は静的関数といいます。
ならば、メモリーも関数と変数を常駐させて次のようにコード組むと有効でしょうか。
#include<iostream>
using namespace std;
using namespace System;
static void f();
static void g();
int main(){
   f();
   g();
}
static void f(){
   static int i;
   i=2;
   cout<<i<<endl;
}
static void g(){
   i=3;
   cout<<i<<endl;
}

答えは、次話で。






第2話へ 第4話へ


戻る


VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)