はじめに
Webアプリケーションは、違う記事で書こうと思う。今日はAtcoderの復習は休みます。
ロベールC++
静的メンバ関数
昨日に書いた B.cpp
B.cppの中のmain関数
int main()
{
B a;
a.show();
{
B b;
a.show();
b.show();
}//bのデストラクタを呼んでいる
a.show();
}
この show関数
は、 m_count
を出力するためだけの関数である。 m_count
は static
なメンバ変数なので、プログラムのはじめに初期化される。なので、クラスを実体化しなくても m_count
を使うことができる。この場合、 show関数
は、静的メンバ関数にするべきである。
B_2.cpp
#include <iostream>
class B {
public:
B();
virtual ~B();
static void show();
private:
static int m_count;
};
int B::m_count;//静的変数は0で初期化される
B::B()
{
m_count++;
}
B::~B()
{
m_count--;
}
void B::show()
{
std::cout << m_count << std::endl;
}
int main()
{
B::show();//宣言してないけど、staticな値なので0で初期化されている。
B a;
B::show();
{
B b;
B::show();
}//デストラクタを呼んでいる
B::show();
}
実行結果
0
1
2
1
静的メンバ関数の注意点は、静的メンバ関数にはそれを呼び出すときの実体のアドレスが渡されないので、静的メンバ関数内では静的メンバ変数と関数しか使えない。
でも、引数に非性的メンバ変数やクラスを渡すと使えるようになる。
シングルトンクラス (おまけ)
あるクラスのオブジェクトが一つだけ生成したいとき、このオブジェクト指向?の考え方を使う。シングルトンクラスでは、コンストラクタを private
にして、その実体を 静的メンバ関数
で返すようにしたらシングルトンクラスの完成です。シングルトンクラスは、比較的安全なグローバル変数といった感じで使う。
終わりに
おやすみなさい