Cpp クラス 静的メンバ関数 新しいページはコチラ
提供: yonewiki
(→静的メンバ関数) |
(→静的メンバ関数) |
||
46行: | 46行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | そして、MemberFunc001.cppに★1. | + | そして、MemberFunc001.cppに★1.部分の静的メンバ関数のプログラムを追加して |
<syntaxhighlight lang="cpp" line start="1"> | <syntaxhighlight lang="cpp" line start="1"> | ||
… | … | ||
55行: | 55行: | ||
a.mpub_nValue = b.mpub_nValue; | a.mpub_nValue = b.mpub_nValue; | ||
b.mpub_nValue = n; | b.mpub_nValue = n; | ||
− | CMemberVar001::m_nValue_static = 0; | + | CMemberVar001::m_nValue_static = 0;★2.静的メンバ変数の呼び出しは出来る。 |
} | } | ||
… | … | ||
62行: | 62行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | とします。静的メンバ関数内部では、クラス内の各種メンバ変数やメンバ関数の呼び出しは出来ませんが、★2.部分のように静的メンバ変数を利用することはできます。もちろん、引数でわたされた静的メンバ関数を含むクラス自体の実体に含まれるメンバ変数とメンバ関数はアロー演算子やドットによる選択演算子を使うことによって利用はできます。使えないのはクラス内部のmpub_nValueのような表記をする変数です。静的メンバ関数は実体化されなくても呼び出されるのですから、そういったクラス内部を指し示すような変数は使えません。 | |
+ | |||
+ | |||
+ | ちなみにmfpub_XerSwap_mpub_nValueという関数はCMemberFunc001クラス型の参照型変数2つを引数として、2つのクラスの実体に含まれるメンバ変数mpub_nValueの値を受け取った二つのクラスの中で交換するという処理をしています。int型のメンバ変数の値を交換するだけなので、よくみかける交換処理が記述されています。 | ||
+ | |||
77行: | 81行: | ||
CMemberFunc001* CMemberFunc002_Instance = new CMemberFunc001; | CMemberFunc001* CMemberFunc002_Instance = new CMemberFunc001; | ||
− | CMemberFunc001_Instance->m_nValue_static = 1; | + | CMemberFunc001_Instance->m_nValue_static = 1;//★4.実体変数からメンバ変数を呼び出し。 |
CMemberFunc001_Instance->mpub_nValue = 1000; | CMemberFunc001_Instance->mpub_nValue = 1000; | ||
CMemberFunc002_Instance->mpub_nValue = 2000; | CMemberFunc002_Instance->mpub_nValue = 2000; | ||
83行: | 87行: | ||
printf("%d %d %d\n",CMemberVar001::m_nValue_static,CMemberFunc001_Instance->mpub_nValue,CMemberFunc002_Instance->mpub_nValue); | printf("%d %d %d\n",CMemberVar001::m_nValue_static,CMemberFunc001_Instance->mpub_nValue,CMemberFunc002_Instance->mpub_nValue); | ||
− | CMemberFunc001::mfpub_XerSwap_mpub_nValue(*CMemberFunc001_Instance,*CMemberFunc002_Instance); | + | CMemberFunc001::mfpub_XerSwap_mpub_nValue(*CMemberFunc001_Instance,*CMemberFunc002_Instance);//★3.静的メンバ関数呼び出し |
printf("%d %d %d\n",CMemberVar001::m_nValue_static,CMemberFunc001_Instance->mpub_nValue,CMemberFunc002_Instance->mpub_nValue); | printf("%d %d %d\n",CMemberVar001::m_nValue_static,CMemberFunc001_Instance->mpub_nValue,CMemberFunc002_Instance->mpub_nValue); | ||
90行: | 94行: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | そうすると、3.部分のように静的メンバ関数を呼び出すことができて、特に実体化されていなくても関数を名前解決スコープ演算子を使うことで、変数名、オブジェクト名、インスタンス(実体)名を使って、ドットによる選択演算子やアロー演算子を使わずに静的なメンバ関数を呼び出すことができます。 | |
+ | |||
+ | |||
+ | 実は、変数名やオブジェクト名、インスタンス名を使っても静的メンバ関数を呼び出すことはできます。どのような方法で呼び出しても構わないです。ちなみに★4.部分では、静的メンバ変数の呼び出しをインスタンス(実体)名を使って、呼び出ししています。 | ||
+ | |||
+ | |||
+ | その結果、出力の結果は以下のようになります。 | ||
出力結果 | 出力結果 | ||
113行: | 123行: | ||
■CMemberVar001コンストラクタ 処理終了 | ■CMemberVar001コンストラクタ 処理終了 | ||
1 1000 2000 | 1 1000 2000 | ||
− | 0 | + | 0 2000 1000 |
</syntaxhighlight> | </syntaxhighlight> | ||
といった出力になります。 | といった出力になります。 | ||
+ | |||
+ | |||
+ | このようにクラスに関係のある、変数の入れ替え処理として静的なメンバ関数を定義したことになり、クラスの中に含めて、記述することが非常に自然な振る舞いであることがわかっていただけたと思います。たぶん。静的メンバ関数とはこういうものです。 |