いつもお世話になります。今 WinXP、VC6.0で開発を行っているのですがそこで以下
のようなソースを見ました。
XXX.h
class TestSample
{
・・・・・・
private:
static int m_nNumber;
・・・・・・
};
ここで疑問なのですが メンバー変数にstaticをつけることによりどのようなメリット
があるのでしょうか?? 私はローカルメソッド内でstaticを利用することはあるのです
が・・・クラスのメンバー変数につけたことがないのでよくわからないでご教授よろし
くお願いします。
あるclassのインスタンスを複数作成した場合に、
staticでないメンバはインスタンス毎に値を保持するが、
staticのメンバは1つしか作成されないため、インスタンス間で値が共有される。
上記例だと、
> TestSample ObjA, ObjB;
と二つのインスタンスを作成し、ObjAの中で、
> m_nNumber = 1;
とした場合、ObjBの中では、
> m_nNumber == 1;
が成り立つ。
privateな静的メンバ変数は
同クラスの静的メソッドから使うことがあります。
参考
静的メンバ
http://wisdom.sakura.ne.jp/programming/cpp/cpp41.html
第30章 静かなるメンバ3
http://www1.kcn.ne.jp/~robe/cpphtml/html02/cpp02030.html
> 同クラスの静的メソッドから使うことがあります。
とは限らなかったです。静的でないメソッドからも使うことありました。
たとえば、そのクラスがインスタンス化された数を知りたいときに、
static int m_instanceNum;
をもっておけば、コンストラクタで、
m_instanceNum++;
とするとか。
メモリリークチェックのために、デストラクタで
m_instanceNum--;
しておいて、
プログラムの最後に、
assert(m_instanceNum==0);
を加えて、リークチェックするとか。
あと、たとえば、オセロのプログラムを作るとして、
class Othello {
public:
static const int BLACK = 1;
static const int WHITE = -1;
};
とすることは、ありますね。
BLACKとかWHITEは、インスタンス毎に必要な変数ではないですから。
使い道は、他にもあると思いますよ。
KING・王さん。Blue さん。reshiaさん。ありがとうございます。
みなさんの助言を拝見させて頂きまして、少し疑問ができました。
>あるclassのインスタンスを複数作成した場合に、
>staticでないメンバはインスタンス毎に値を保持するが、
>staticのメンバは1つしか作成されないため、インスタンス間で値が共有される。
これらの考えはオブジェクト指向にはなるのでしょうかね??同じクラスのインスタ
ンスでも 別オブジェクト同士での値の共有というのはカプセル化などの考えとは違っ
てくるのではないでしょうか??
まだまだオブジェクト指向を理解していなくて 的外れな質問かもしれませんがよろ
しくお願いします。
属性(変数)には各インスタンスが持つものの他、クラスが持つ(つまり全インスタンスが共有す
る)
ものも考えられますし、それが必要となることがあります。
staticメンバは後者。
KING・王さん。Blue さん。reshiaさん。επιστημη さん。ありがとうございます。
また、何かありましたらよろしくお願いします