1-08. ストレージクラス

公開日: 1:01 1. 基本編/1-08. ストレージクラス


ストレージクラスは変数や関数のスコープと寿命を定義します。指定子は型の前につけます。 C++で使われるストレージクラスには次のものがあります。
  • auto
  • register
  • static
  • extern
  • mutable

autoストレージクラス

※C++11で廃止され、今では別の機能が割り当てられています。

autoストレージクラスはすべてのローカル変数のデフォルトストレージクラスです。
{
   int mount;
   auto int month;
}
上の例では同じストレージクラスの2つの変数を定義していて、autoは関数内でのみ変数などに対して使うことができます。


register(レジスタ)ストレージクラス

registerストレージクラスはRAMではなくレジスタに格納したいローカル変数を定義するのに使われます。これは変数がレジスタサイズと等しい最大サイズ(一般的に1ワード)であり、(まるでメモリ内に存在しないように)&オペレータを適応できないことを意味します。
{
   register int  miles;
}
registerはカウンタなどのような高速なアクセスを要求する変数にのみ使われるべきです。また、register変数がレジスタに格納されるという意味ではないことについても注意が必要です。ハードウェアと実装の制限に依存してregisterに格納される可能性があることを意味します。

static(静的な)クラスストレージ

staticクラスストレージはコンパイラに対して、ローカル変数をスコープの中に入ったり出たりする度に生成と破棄をするのではなく、プログラムが生きている間保持するよう指示します。従って、ローカル変数をstaticにするとその値を関数の呼び出し間で維持できるようになります。 

static修飾子はグローバル変数にも適応することができます。これが行われると、変数のスコープは宣言されたファイル内に限定されます。

C++においてstaticがクラスのメンバに使われた場合、唯一のメンバのコピーがクラスのオブジェクトに共有されるようになります。
#include <iostream>
 
// 関数宣言
void func(void);
 
static int count = 10; /* グローバル変数 */
 
main()
{
    while(count--)
    {
       func();
    }
    return 0;
}

// 関数定義
void func( void )
{
    static int i = 5; // ローカルstatic変数
    i++;
    std::cout << "i is " << i ;
    std::cout << " and count is " << count << std::endl;
}

上のコードをコンパイル・実行すると、次の結果を返します。
i is 6 and count is 9
i is 7 and count is 8
i is 8 and count is 7
i is 9 and count is 6
i is 10 and count is 5
i is 11 and count is 4
i is 12 and count is 3
i is 13 and count is 2
i is 14 and count is 1
i is 15 and count is 0

externストレージクラス

externストレージクラスはすべてのプログラムファイルに見えるようグローバル変数の問い合わせ先を教えます。

複数のファイルを扱っていて他のファイルでも使われるグローバルな変数や関数を定義した時、他のファイルからそれらの変数や関数の問い合わせ先を教えるために使われます。単純な理解としては、externは他のファイルで定義されたグローバル変数や関数に対して使われます。

extern修飾子は一般的に2つ以上のファイルがあるときに同じグローバル変数や関数や共有するときに使われ、つぎのようになります。

File1: main.cpp
#include <iostream>
 
int count ;
extern void write_extern();
 
main()
{
   count = 5;
   write_extern();
}

File2: support.cpp
#include <iostream>
 
extern int count;
 
void write_extern(void)
{
   std::cout << "Count is " << count << std::endl;
}

ここではexternは他のファイルで宣言されたcount変数に対して使われています。これら2つのファイルを次のようにコンパイルします。

$g++ main.cpp support.cpp -o write

これは実行可能なwriteプログラムを生成し、次の結果となるのを確認してください。
$./write
Count is 5

mutableストレージクラス

mutable修飾子はクラスオブジェクトにのみ使われるので、後のページで説明します。mutableはオブジェクトのメンバにconstを上書きすることができます。すなわち、mutableメンバはconstメンバ関数を変更することができます。
  • ?±??G???g???[?d????u?b?N?}?[?N???A

0 件のコメント :

コメントを投稿