変数のアクセス権の有効範囲とライフタイム

有効範囲は基本的に 2 つあります。それらはローカルスコープとグローバルスコープです。

全ての関数の外で宣言された変数は、グローバルスコープに属します。このような変数はプログラムのどこからでもアクセス可能です。それらはメモリのグローバルプールに配置されているので、ライフタイムはプログラムのライフタイムと一致します。

ブロック(中括弧で囲まれたコードの一部)の内側に宣言された変数はローカルスコープに属します。このような変数は、それが宣言されているブロック外からは見えません(従って使用出来ません)。ローカル宣言の中で最も一般的なケースは、関数内で宣言された変数です。ローカルに宣言された変数は、スタック内に位置しライフタイムは関数のライフタイムに等しいです。

ローカル変数の有効範囲はそれが宣言されているブロックなので、他のブロックで宣言された変数と、またグローバルレベルまでの上位レベルで宣言された変数と同名の変数を宣言することが可能です。

例:

void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
 {
  int        i,limit;
  static int weightsum=0;
  double     sum=0;
//---
  if(prev_calculated==0)
    {
     limit=MA_Period+begin;
    //--- 初めのリミットバーに空の値を設定する
    for(i=0; i<limit; i++) LineBuffer[i]=0.0;
    //--- 最初に表示される値を計算する
    double firstValue=0;
    for(int i=begin; i<limit; i++)
       {
        int k=i-begin+1;
        weightsum+=k;
        firstValue+=k*price[i];
       }
     firstValue/=(double)weightsum;
     LineBuffer[limit-1]=firstValue;
    }
  else
    {
     limit=prev_calculated-1;
    }
 
  for(i=limit;i<rates_total;i++)
    {
     sum=0;
    for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
     LineBuffer[i]=sum/weightsum;
    }
//---
 }

同じ行で宣言された変数 i にご注意ください。

    for(int i=begin; i<limit; i++)
       {
        int k=i-begin+1;
        weightsum+=k;
        firstValue+=k*price[i];
       }

i の有効範囲はループのみです。ループの外には、関数の初めで宣言された同名の変数が存在します。また、変数 k はループ本体で宣言されているので、その有効範囲はループ本体です。

ローカル変数は、アクセス指定子 static を使用して宣言することが出来ます。この場合、コンパイラはメモリのグローバルプール内に変数を有します。従って、静的変数のライフタイムは、プログラムのライフタイムに等しいです。ここではそのような変数の有効範囲は、それが宣言されているブロックに制限されています。

参照

データ型型のカプセル化と拡張性変数の初期化オブジェクトの作成と解徐