// 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;
}
この講座の著作権はロベールが保有しています