Cpp クラス 静的メンバ関数 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(静的メンバ関数)
 
1行: 1行:
 +
[[C PlusPlus#C++からの技術|C++]]に戻る
 +
 +
 
<table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner">
 
<table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner">
 
<tr>
 
<tr>
 
<td style="width:1px;"></td>
 
<td style="width:1px;"></td>
<td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++ クラス 静的メンバ関数</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td>
+
<td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++(Cpp) クラス 静的メンバ関数</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td>
 
</tr>
 
</tr>
 
</table>
 
</table>
8行: 11行:
 
<br />
 
<br />
 
== '''静的メンバ関数''' ==
 
== '''静的メンバ関数''' ==
 +
 
静的メンバ変数と同じようなで静的メンバ関数があります。これもクラスが実体化されていなくても呼び出せるもので、静的メンバ変数は呼び出せるオブジェクト変数としての役割でしたが、ここでは呼び出し可能な関数であるということになります。実体化されていないメンバ関数は実体がないのですから、通常の静的ではないメンバ変数や関数は呼び出すことが出来ません。実体化されていないのですから、まだコンストラクタも動作していなければメンバ変数の初期化もされていないし、もし実体化されていたとしても、実体ごとに異なる値を保持していても区別して呼び出す方法、静的なメンバ関数の内部からは外部で生成されたであろう、クラスの実体を参照することは出来ないし、予測もできないので、通常のメンバ変数やメンバ関数が呼び出せないのは、ごく自然なことです。
 
静的メンバ変数と同じようなで静的メンバ関数があります。これもクラスが実体化されていなくても呼び出せるもので、静的メンバ変数は呼び出せるオブジェクト変数としての役割でしたが、ここでは呼び出し可能な関数であるということになります。実体化されていないメンバ関数は実体がないのですから、通常の静的ではないメンバ変数や関数は呼び出すことが出来ません。実体化されていないのですから、まだコンストラクタも動作していなければメンバ変数の初期化もされていないし、もし実体化されていたとしても、実体ごとに異なる値を保持していても区別して呼び出す方法、静的なメンバ関数の内部からは外部で生成されたであろう、クラスの実体を参照することは出来ないし、予測もできないので、通常のメンバ変数やメンバ関数が呼び出せないのは、ごく自然なことです。
  
28行: 32行:
  
  
また位置からサンプルをつくるのもなんなので、[[Cpp クラス メンバ関数|メンバ関数]]の記事を記述したときに使ったプログラムを改造することでサンプルにしてみたいと思います。
+
またイチからサンプルをつくるのもなんなので、[[Cpp クラス メンバ関数|メンバ関数]]の記事を記述したときに使ったプログラムを改造することでサンプルにしてみたいと思います。
  
  
46行: 50行:
  
 
</syntaxhighlight>  
 
</syntaxhighlight>  
そして、MemberFunc001.cppに★1.部分のプログラムを追加して
+
そして、MemberFunc001.cppに★1.部分の静的メンバ関数のプログラムを追加して
 
<syntaxhighlight lang="cpp" line start="1">
 
<syntaxhighlight lang="cpp" line start="1">
 
 
55行: 59行:
 
   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行: 66行:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
とします。
+
とします。静的メンバ関数内部では、クラス内の各種メンバ変数やメンバ関数の呼び出しは出来ませんが、★2.部分のように静的メンバ変数を利用することはできます。もちろん、引数でわたされた静的メンバ関数を含むクラス自体の実体に含まれるメンバ変数とメンバ関数はアロー演算子やドットによる選択演算子を使うことによって利用はできます。使えないのはクラス内部のmpub_nValueのような表記をする変数です。静的メンバ関数は実体化されなくても呼び出されるのですから、そういったクラス内部を指し示すような変数は使えません。
 +
 
 +
 
 +
ちなみにmfpub_XerSwap_mpub_nValueという関数はCMemberFunc001クラス型の参照型変数2つを引数として、2つのクラスの実体に含まれるメンバ変数mpub_nValueの値を受け取った二つのクラスの中で交換するという処理をしています。int型のメンバ変数の値を交換するだけなので、よくみかける交換処理が記述されています。
 +
 
  
  
77行: 85行:
 
   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行: 91行:
 
   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行: 98行:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
そうすると
+
そうすると、3.部分のように静的メンバ関数を呼び出すことができて、特に実体化されていなくても関数を名前解決スコープ演算子を使うことで、変数名、オブジェクト名、インスタンス(実体)名を使って、ドットによる選択演算子やアロー演算子を使わずに静的なメンバ関数を呼び出すことができます。
 +
 
 +
 
 +
実は、変数名やオブジェクト名、インスタンス名を使っても静的メンバ関数を呼び出すことはできます。どのような方法で呼び出しても構わないです。ちなみに★4.部分では、静的メンバ変数の呼び出しをインスタンス(実体)名を使って、呼び出ししています。
 +
 
 +
 
 +
その結果、出力の結果は以下のようになります。
  
 
出力結果
 
出力結果
113行: 127行:
 
■CMemberVar001コンストラクタ 処理終了
 
■CMemberVar001コンストラクタ 処理終了
 
1 1000 2000
 
1 1000 2000
0 1000 2000
+
0 2000 1000
 
</syntaxhighlight>
 
</syntaxhighlight>
 
といった出力になります。
 
といった出力になります。
 +
 +
 +
このようにクラスに関係のある、変数の入れ替え処理として静的なメンバ関数を定義したことになり、クラスの中に含めて、記述することが非常に自然な振る舞いであることがわかっていただけたと思います。たぶん…
 +
 +
 +
静的メンバ関数とはこういうものです。ちなみに関数名にXerSwapとしましたが、XにはTransという意味がありまして、Transfer Xferで変換という意味があります。Trasn自体はその向こうにというような意味があります。またぐというような意味あいから交差を意味するXがしばしば代用される慣習がうまれたものと思われます。Xerだと略しすぎなので本来はXferとして表現すべきなのかもしれません。他にもXにはいろいろな使い方がされます。そのあたりの詳細な解説はWikipediaのXの記事にゆずりたいと思います。交換変換か…
 +
 +
 +
[[C PlusPlus#C++からの技術|C++]]に戻る

2021年2月6日 (土) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス