// Static1.cpp #include <iostream.h> #include <memory.h> // memset を使うためのヘッダファイルです //////////////////////////////////////////////////////////////////////////////// // アドレスが常に一定かのチェック // 前章で行った方法と同じですね void AddressCheck_Sub() { static int a; int b; cout << "&a = " << &a << endl; cout << "&b = " << &b << endl; } void AddressCheck_Sub2() { cout << "in Sub2" << endl; AddressCheck_Sub(); } void AddressCheck() { cout << "アドレスが常に一定かのチェック" << endl; AddressCheck_Sub(); AddressCheck_Sub2(); AddressCheck_Sub(); } //////////////////////////////////////////////////////////////////////////////// // 初期化が1回しかされないかのチェック // 第9章でやったのと同じ方法ですね void InitOnceCheck_Sub() { static int a = 3; int b = 3; cout << "a = " << a << endl; cout << "b = " << b << endl; a++; b++; } void InitOnceCheck() { cout << endl << "初期化が1回しかされないかのチェック" << endl; InitOnceCheck_Sub(); InitOnceCheck_Sub(); } //////////////////////////////////////////////////////////////////////////////// // 0で初期化されるかのチェック // 偶然0だったときのために、4個くらい変数を作って確かめます // 自動変数も一緒に確認してみます void ZeroInitCheck_Sub() { static int a, b, c, d; cout << a << ',' << b << ',' << c << ',' << d << endl; } void ZeroInitCheck_Sub2() { int a, b, c, d; cout << a << ',' << b << ',' << c << ',' << d << endl; } void ZeroInitCheck() { cout << endl << "0で初期化されるかのチェック" << endl; ZeroInitCheck_Sub(); ZeroInitCheck_Sub2(); } //////////////////////////////////////////////////////////////////////////////// // 値が保証されるかのチェック // int*& は、int* への参照です void HoldValueCheck_Sub(int*& pa, int*& pb) { static int a = 9; int b = 9; pa = &a; pb = &b; } // 大きな変数を作って、それを0で埋めます // memset はメモリを指定した数値で埋める関数です void HoldValueCheck_Sub2() { int dummy[100]; memset(dummy, 0, sizeof dummy); } void HoldValueCheck() { cout << endl << "値が保証されるかのチェック" << endl; int *pa, *pb; HoldValueCheck_Sub(pa, pb); HoldValueCheck_Sub2(); // この関数を呼んでも値は保証されているかな? cout << "*pa = " << *pa << endl; cout << "*pb = " << *pb << endl; } //////////////////////////////////////////////////////////////////////////////// // main 関数 int main() { AddressCheck(); InitOnceCheck(); ZeroInitCheck(); HoldValueCheck(); return 0; }この講座の著作権はロベールが保有しています