2014年1月9日木曜日

C++  静的メンバ関数




静的メンバ関数とは、静的メンバ変数にだけ
アクセスするための関数です。


メンバ関数にstaticを付けて宣言すると、
静的メンバ関数になります(^^)






class Food
{
public:
    static double sm_tax;
    static void SetTax(double tax){  //staticを付ける
        sm_tax = tax;

    }
        :

なお、静的メンバ関数から同じオブジェクト内のメンバを利用するには
メンバにstaticをつけなければなりません。
つまり、static以外のメンバにアクセスはできないということです(^^;)

静的メンバ関数の呼び出しかた
静的メンバ関数なので、静的メンバ変数と同様にオブジェクトを生成しなくても
呼び出すことができます。

nt main(void)
{
    Food::SetTax(1.05);  //スコープ解決演算子を使用
   :

また、オブジェクトを生成した場合は、通常のメンバ変数を呼び出すのと同じように
呼び出すことができます(^^)
   :
    Food myFood;
    myFood.SetPrice(1500);
       :

スコープ解決演算子を使って呼び出すのが分かりやすくておススメですね。

では、例によってプログラム全体を。
#include <iostream>

using namespace std;

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

double Food::sm_tax = 0;

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

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

int main(void)
{
    Food::SetTax(1.05);  //スコープ解決演算子を使用

    Food myFood;

    myFood.SetPrice(1500);
    cout << "Food Price[1500](in tax 5%) = " << myFood.GetPrice() * myFood.sm_tax << endl;

    //.(ピリオド)を使ってアクセス
    myFood.SetTax(1.08);  //増税して8%になってしまった...
    cout << "Food Price[1500](in tax 8%) = " << myFood.GetPrice() * myFood.sm_tax << endl;

    return 0;
}

実行結果
# ./test
Food Price[1500](in tax 5%) = 1575
Food Price[1500](in tax 8%) = 1620

新年あけまして、増税が近づいてきました...(-_-;)

今日の名言
コロラド州ロングズ・ピークの山腹に一本の巨木の残骸がある。博物学者によれば、
樹齢四百年の木だという。その木は、コロンブスがサン・サルバドルに上陸した頃は
苗木であったし、清教徒たちがプリマスに定住した頃には若木に成長していた。
その木は長い生涯の間に十四回も落雷に見舞われ、四世紀間には数えきれないほど
多くの雪崩や暴風雨がその木を襲った。その木はひたすら生き抜いた。しかしながら、
最後はカブトムシの大群が押し寄せ、その巨木を地上に倒してしまった。虫たちは
樹皮を破って侵入し、少しずつではあるが間断のない攻撃によって、徐々に巨木の
生命力を破壊してしまったのである。長い歳月に耐え、雷鳴を物ともせず、嵐にも
屈しなかった森の巨木が、人間の指でひねりつぶされてしまう小さな虫たちのために、
ついに倒されてしまったのだ。
                               ハリー・エマーソン・フォスディック