2014年1月7日火曜日

C++ 静的メンバ変数




今回は静的メンバ変数の話です。

これは、メンバ変数に static を付けるだけで

「静的メンバ変数」になります。

静的メンバ変数とは、複数のオブジェクトで
共通のメモリ領域を持つメンバ変数のことです。



一つのクラスから精製したオブジェクトの静的メンバ変数は、
値が共通になります。

どのオブジェクトでも共通なデータは static にできますので、
メモリの節約に役立ちます(^^)

class Food
{
public:
    static double sm_tax;    //staticを付ける
    void SetPrice(int price);
    int GetPrice(void);
private:
    int m_price;
};

静的メンバ変数の初期化について
静的メンバ変数の初期化は cppファイルの中で一度だけ行います。
コンストラクタで初期化しないよう注意してください。(^^;)
オブジェクトの生成ごとに何度も初期化されてしまいますので(*´Д`)

静的メンバ変数のアクセスについて
publicな静的メンバ変数の場合、オブジェクトを生成しなくても
スコープ解決演算子を使ってアクセスすることができます。
また、オブジェクトを生成している場合は、「.(ピリオド)」を使って
通常のメンバ変数のようにアクセスすることもできます。

int main(void)
{
    Food::sm_tax = 1.05;  //初期化
    Food myFood;
       :
    myFood.sm_tax = 1.08;  //増税8%
        :

では、サンプルプログラム全体です。

#include <iostream>
#include <string.h>

using namespace std;

class Food
{
public:
    static double sm_tax;    //staticを付ける
    void SetPrice(int price);
    int GetPrice(void);
private:
    int m_price;
};

double Food::sm_tax = 1.05;

void Food::SetPrice(int price)
{
    m_price = price;
}

int Food::GetPrice(void)
{
    return m_price;
}

int main(void)
{
    Food::sm_tax = 1.05;  //初期化

    Food myFood;

    myFood.SetPrice(1500);
    cout << "Food Price1 = " << myFood.GetPrice() * Food::sm_tax << endl;

    myFood.sm_tax = 1.08;  //増税8%
    cout << "Food Price2 = " << myFood.GetPrice() * Food::sm_tax << endl;

    return 0;
}

実行結果
# ./test
Food Price1 = 1575
Food Price2 = 1620

うむむ、消費税8%だと 1500円のモノを買った時の値段は
割高感満点ですね(-_-;)

今日の名言
幸福への道はただ一つしかない。それは意志の力でどうにもならない物事は
悩んだりしないことである。
                           エピクテトス

随分前のことだが、ある日私は不安と幻滅をおぼえ、私の一生は自分では
どうにもならない力で操られているように思われた。ある朝ふと新約聖書を
開いてみると、次の一節が目に止まった。「我を地上に送りたまいし者、常に
我とともにあり-父なる神は我を見捨てたまわず」私の人生はその瞬間から
一変した。それ以来、私にはあらゆることが永遠に違ったものとなった。
一日として、この一節を繰り返さない日はなかった。近年、多くの人々が
私のもとを訪れて助言を求めるが、私はいつも別れ際にこの励ましの言葉を
伝えている。この一節に目を止めて以来、私はこの言葉によって生きてきた。
私はこの一節とともに歩み、この中に平和と力とを見出している。私にとっては、
これこそ宗教の真髄である。この言葉は、人生を価値あるものにするすべての
物の基盤となっている。何物にも代えがたい私の人生の教科書である。
                           ジョセフ・R・サイズー