修飾子とは「static」は静的という意味で「dynamic(動的)」の対義語である。下記の様に変数宣言または関数宣言時に「static」を付加することで、付加された変数または関数が静的であることを宣言する。}ここで言う「静的」の具体的な意味は変数、関数の種類によってかなり異なる。初級者にとってマスターしづらいもののひとつではないかと思う。本稿では、それぞれの種類について具体的に解説し、お約束の演習問題も用意している。理解しづらい概念も、手を動かして演習問題を解いていけば誰でもマスターできるものなので、ちゃんと演習問題をクリアーしてほしい。下記のように、同じプロジェクトに含まれる複数のファイルに、同じ関数名・引数の関数があると、リンク時にエラーになる。1;}このエラーを避けるには、どちらかの関数の前に「static」を付ける。そのファイル内だけのローカルな関数となり、他のファイルの同一関数名・引数の関数とバッティングすることはなくなる。個人的には同じ関数名・引数のものを複数定義することはお薦めしない。わからないので、どれが呼ばれているのかがすぐに解らない。なにより、同じ関数名・引数の関数が複数あるのは混乱の元だ。適切な関数名を付け、同一関数名にはしないことを強くお薦めするただし、下記の例の様に引数が異なっていれば同一名称の関数を定義してもOKだ。関数を定義し、リンクエラーが出ることを確認しなさい。関数と同様に、グローバル変数も、下記の様に複数のファイルで同一名称のものが定義されていると、リンク時にエラーとなる。1;が、関数の場合と同様に、そもそも複数のグローバル変数に同じ変数名を付ける意味は無いだろうから、そのような変数を宣言しないことを強く薦める。演習問題:(解答例は省略)複数のファイルで、同一型、名称のグローバル変数を定義し、リンクエラーが出ることを確認しなさい。付け、エラーが無くなることを確認しなさい複数のファイルで、同一名称だが型の異なるグローバル変数を定義し、リンクエラーが出るかどうかを確認しなさい。修飾子を付けると、その識別子がそれを記述したファイルでのみ有効になることを前章までに説明した。識別子の有効範囲を指定するものだったわけだ。意味は前章までとは異なる。ローカル変数識別子の有効範囲(スコープ)は、そもそも当該ブロック内だけである。付けてもその点はなんら変化しない。付けた効果は何かというと、「スコープを抜けても変数の値がそのまま保持される」という点である。そのスコープに入るのが一度っきりであれば、その違いに意味・意義は無いが、関数やループ内ブロックであれば何度もスコープに出入りすることがあるので違いが出てくる。再初期化されるからだ。情報はそのまま残り、再度呼ばれたときも再初期化は行われない。情報を残しておいた意味が無くなるからだ)関数を抜けても情報はそのまま残るが、スコープの範囲外から変数を参照することは出来ない。ローカル変数は永続的という意味でグローバル変数と同じで、識別子の有効範囲はローカル変数と同様にそのスコープ内だけということだ。ローカル変数はそのスコープに最初に入ったときに初期化される。変数は一度も初期化されない。ローカル変数にすることが可能だぞ。ローカル変数を宣言し、値を設定・更新しなさい。関数を複数回コールし、値が保持されていることを確認しなさい。クラスオブジェクトローカル変数を宣言し、そのスコープに入った時点でコンストラクタが呼ばれることを確認しなさい。宣言では、メンバ変数を宣言することが出来る。型のメンバ変数};メンバ変数は、クラスから作られたオブジェクト(=インスタンス)が個々に保持する変数だ。オブジェクトが異なれば、異なる値を保持することが出来る。機能はこれまで(ファイル内固有、値の永続化)とはまったく違う。付加すると、そのメンバ変数はオブジェクトが保持するのではなく、クラスが保持することになるのだ。難しいと言われる理由のひとつは、識別子や記号の多義性にあるのではないかと考える。文脈で意味が異なるのは初学者にとっては理解しづらいことこの上ない。変数のように宣言時に初期値の指定が出来ないのだ。付加すると、初期化することが可能になる。これはクラス固有の変数ではなくクラス固有の定数となる。やって初期化するかと言うと、グローバル変数のように、クラス外で初期化を行う。(非const)メンバ変数は、アクセスがクラスからに限られるグローバル変数と同じと考えるとよい。置いて、クラス外からのアクセスを許可することも出来る。付けて宣言した場合は、クラス固有の定数となる。場合と異なり、値を宣言時に指定し、初期化のための文を書く必要はない。メンバ変数を参照・代入し、それがオブジェクト固有ではなく、クラス固有であることを確認しなさい。メンバ変数と同様に、オブジェクト固有ではなく、クラス固有なものとなる。これはどういうことかと言うと、各オブジェクトが保持する通常のメンバ変数にはアクセス出来ないということだ。メンバ変数にアクセス出来ない代わりに、オブジェクトを生成しなくてもコール出来る、というメリットがあるのだ。とどこからでも呼ぶことが可能になる。メンバ関数内で、そのクラスオブジェクトを生成し、それのメンバ変数にアクセスすることは可能。その具体例は、次章を参照されたし。シングルトンよく出てくる例であるが、スタティックなメンバ関数を使ってシングルトン(アプリケーションでインスタンス数をひとつだけに制限したもの)を実装することが出来る。オブジェクトを勝手に生成されることがないように、(デフォルト)コンストラクタ、コピーコンストラクタ、代入演算子をプライベートにしておく。シングルトンオブジェクトを生成するメンバ関数はスタティックとし、その定義中でスタティック変数を生成し、その参照を返す。参照ではなくポインタにしてもよい。ポインタにする場合は以下のように記述する。メンバ変数として実装することも出来る。シングルトンポインタを返す}このような実装方法は冗長なのでいかがなものかと考える。素直に最初に示した実装方法を採用するのがよいだろう。