🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2308
おさらい 静的メンバ変数とは何のことでしたでしょうか? 自作関数内で宣言されたローカル静的(static)変数についておさらいしてみましょう
クラスの静的メンバ変数について考察してみよ~う
おさらい 静的メンバ変数とは何のことでしたでしょうか? 自作関数内で宣言されたローカル静的(static)変数についておさらいしてみましょう
ソーラー「では 突然ですが
静的変数についておさらいしてみたいと思います
静的(static)変数には自作関数内で宣言されたローカル静的(static)変数と
プログラム全体で作用する
グローバル静的(static)変数というものがありましたね
まずは
自作関数内で宣言されたローカル静的(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をとりこみました。
ソーラー「
このプログラムにおいて
自作関数f内で静的(static)変数宣言
static int a=1;
の実行により生成されているローカル静的(static)変数aの情報は
f();が実行されても消えることなく保持されつづけています。。
ふつうは
静的変数宣言でない
int a=1;
が用いられた
以下のように定義された自作関数fが実行されると
👇
void f(void){
int a=1;
cout << a << "をとりこみました。\n";
a++;
}
👆
マックス「
自作関数fが実行されると…(´▽`*)
はうはう」
ソーラー「
自作関数fが実行されると
その自作関数f内で変数宣言された変数は
その変数名とその変数に格納されたデータとともに
メモリから消去されます
が
自作関数f内で静的(static)変数宣言
static int a=1;
の実行により生成されているローカル静的(static)変数aの情報は
f();が実行されても消えることなく保持されつづけるというわけです
ただし
ローカル静的(static)変数aの情報は自作関数fの内部でのみ
保存されます」
マックス「なんのことか
ワッカリマセ~ン」
ソーラー「(*´▽`*)
そのような方のために
次のプログラムをご覧ください
👇
#include <iostream>
using namespace std;
void f(void){
static int a=1;
cout << a << "をとりこみました。\n";
a++;
}
int main(){
f();
f();
f();
cout << a << "をとりこみました。\n";
return 0;
}
👆
f();
f();
f();
の次に
命令文
cout << a << "をとりこみました。\n";
をかきこんでも
このプログラムはビルドエラーがでて実行されません。
なぜなら
static変数宣言 static int a=1;をもちいて
自作関数fの変数aの情報が保持されても
いままでのローカル変数のルールどおり
自作関数f内で変数宣言されたローカル変数aは
変数名が同じaであっても
main関数の中で変数宣言され作製された変数a
とは別の変数ということになり
static int a=1;をもちいて
f();
f();
f();
の実行を経て
最終的に
自作関数f内で変数宣言されたstatic変数aに数値データ4が格納されることになっても
main関数内でaは変数宣言されていないので
main関数内でaという名の変数は使用できません
もうすこし 付け加えると
自作関数f内でaが変数宣言されても
main関数内の変数aは変数宣言されたことにはなりません。
自作関数f内でaが変数宣言されても
main関数内でaが変数宣言されていない状態でプログラムを実行しても
エラー (アクティブ) E0020 識別子 "a" が定義されていません
エラー C2065 'a': 定義されていない識別子です。
とビルドエラーが表示されます。
そこで次のプログラムのように
自作関数fとは別に
main関数内でも変数aを変数宣言しておけば
#include <iostream>
using namespace std;
void f(void) {
static int a = 1;
cout << a << "をとりこみました。\n";
a++;
}
int main() {
f();
f();
f();
int a =1;
/*🌞🌞ここです🌞🌞*/
cout << a << "をとりこみました。\n";
return 0;
}
ビルド実行結果
1をとりこみました。
2をとりこみました。
3をとりこみました。
1をとりこみました。
と無事にコンパイルできますね。
ならば・・・」
マックス「えっ続きがあるのか?」
ソーラー「このプログラムで
int a = 1;
を
f();
f();
f();
の前にもってきたなら
cout << a << "をとりこみました。\n";
の
ビルド実行結果はどうなるとおもいますか?
そのプログラムはこちらです
👇
#include <iostream>
using namespace std;
void f(void) {
static int a = 1;
cout << a << "をとりこみました。\n";
a++;
}
int main() {
int a = 1;/*🌞🌞ここです、ここにint a=1;を持ってきました🌞🌞*/
f();
f();
f();
cout << a << "をとりこみました。\n";
return 0;
}
マックス「
int a = 1;
を
f();
f();
f();
の前にもってきたか・・・
f();
f();
f();
が実行されると
自作関数fのローカルstatic変数aに格納されている値は4となるが
自作関数fのローカルstatic変数aは
main関数のブロック{}内で変数宣言された
変数aとは全く異なる別の変数だ
ということは
別の変数に格納されている値が4になったとしても
main関数のブロック{}内で変数宣言された
変数aに格納されている値は
int a=1;
が実行されたときに格納された数値データ1のまま変化しない
つまり
cout << a << "をとりこみました。\n";
の実行結果は
1をとりこみました
になる
どうだ?」
ソーラー「それでは😊
ビルド実行結果は・・・
#include <iostream>
using namespace std;
void f(void) {
static int a = 1;
cout << a << "をとりこみました。\n";
a++;
}
int main() {
int a = 1;/*🌞🌞ここです、ここにint a=1;を持ってきました🌞🌞*/
f();
f();
f();
cout << a << "をとりこみました。\n";
return 0;
}
ビルド実行結果
1をとりこみました。
2をとりこみました。
3をとりこみました。
1をとりこみました。
ソーラー「おめでとうございま~す 正解で~す」
マックス「おお やったぜぇぇいぃ
のりぴ~ うれぴ~~」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます