クラスの静的メンバ変数はそのクラスに備え付けられた変数の役割をはたしておりそのクラス型のオブジェクトならどのオブジェクトでもアクセスすることができます

あるクラス型のオブジェクトの静的メンバ変数aに数値データを代入した場合その数値データは同じクラス型の異なるオブジェクトの静的メンバ変数aにも受け継がれていきます


🐤つづき



ソーラー「つまり


クラスの


静的メンバ変数と


普通のクラスのメンバ変数の違いはなんなのか


ということでいいのかな


結論は


わっかりましぇ~~~ん😊」




マックス「なにぃ」



ソーラー「ねえ、てんC


クラスの静的メンバ変数とメンバ変数のちがいって何かあるのかな?」



てんC「クラスの静的メンバ変数とメンバ変数のちがいですか?


この静的(static)という言葉に秘密😊があるんです


ソーラーさん


以前のエピソードで


静的(static)変数というものが登場してきました。


まずは


次のプログラムをご覧ください。



#include <iostream>


using namespace std;


void f(void) {


int a = 1;


cout << a << "をとりこみました。\n";


a++;


}


int main() {


f();

f();

f();

return 0;

}


プログラムの実行結果


1をとりこみました。

1をとりこみました。

1をとりこみました。



てんC「このように


void f(void) {


int a = 1;


cout << a << "をとりこみました。\n";


a++;


}


と定義された自作関数fを


f();


と実行すれば


自作関数fの定義内で変数宣言された変数aは


f();


の実行ごとに


変数aに格納されているデータごと


メモリから消去されます。


つまり


f();


の実行ごとに


aに格納されている数値は


a=1から


a++;


のはたらきにより


a=2


に変化しているのですが


f();


の実行の終了とともに


変数aごと消去されているというわけです、ね😊


ですので


f();


の実行の後


次の


f();


が実行されるときに


新たに


int a = 1;


cout << a << "をとりこみました。\n";


a++;


が実行されることになります。


つまり


新たに変数aが作製されて変数aに1が代入されるというわけです


次に


静的(static)変数のもちいられたプログラムをご覧ください。


#include <iostream>


using namespace std;


void f(void){


static int a=1;


cout << a << "をとりこみました。\n";


a++;


}


int main(){


f();

f();

f();

return 0;

}


プログラムの実行結果


1をとりこみました。

2をとりこみました。

3をとりこみました。


てんC「このようにプログラムの自作関数f()の定義内の


int a=1;

static int a=1;


に変えて


f();


を実行すると


aに格納されている数値データは


a=1から


a++;


のはたらきにより


a=2


に変化します。


そして


f();


の実行後も


静的(static)変数aは


メモリから消去されることはなく


静的(static)変数aに格納されている値は2のまま


変数aに保存されることになります。


(ただし 静的(static)変数aは自作関数f()内で変数宣言されているので


自作関数f()内でのみ


使用できる変数です


つまり


f();


の実行後も


静的(static)変数aは


メモリから消去されることはないといっても


そもそも


main関数内では変数aは使用できません)」


ソーラー「そういえば静的(static)変数はそんな仕組みだったね。」


てんC「このように静的(static)変数は


静的(static)変数を定義内に含む自作関数が実行された後も


メモリから消去されることはなく


静的(static)変数に格納された値は保存されたままになります。


それと近い関係なのですが(笑)(全然近くないかもですが・・・)


クラス宣言内で


静的メンバ変数aを設定し


cube1のクラスCube型のオブジェクト宣言を実行して


クラスCube型のオブジェクトcube1の静的メンバ変数


cube1.a


を作製したとします


ここで


cube1.a=1;


と数値データを


cube1.aに代入したとします。


次に


cube2のクラスCube型のオブジェクト宣言を実行して


クラスCube型のオブジェクトcube2の静的メンバ変数


cube2.a


を作製したとします


このとき


クラスCube型のオブジェクトcube2の静的メンバ変数


cube2.a


に格納されている値は


クラスCube型のオブジェクトcube1の静的メンバ変数


cube1.a



cube1.a=1;


と代入された


1となります


このように


クラス宣言内で


aの静的メンバ変数宣言を実行しておくと


cube1のクラスCube型のオブジェクト宣言


Cube cube1;


をおこない


クラスCube型のオブジェクトcube1の静的メンバ変数


cube1.a


を作製し


数値データを代入した場合


その代入された数値データは




クラスCube型のオブジェクト宣言


Cube cube2;


を実行して


作製された


クラスCube型の異なるオブジェクトの静的メンバ変数


cube2.aにも受け継がれていきます。


cube3のクラスCube型のオブジェクト宣言


Cube cube3;


を実行して


作製された


クラスCube型のオブジェクトcube3の静的メンバ変数


cube3.a


にも


cube4のクラスCube型のオブジェクト宣言


Cube cube4;


を実行して


作製された


クラスCube型のオブジェクトcube4の静的メンバ変数


cube4.a


にも受け継がれていきます。



ソーラー「すごい 驚いた!」


マックス「おお、静的メンバ変数とはそんな仕組みだったのか!!」


solarplexuss「うちも(#^.^#)驚いたなり(*^。^*)/」










  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る