Cpp クラス const 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(const外し(const_cast))
(const外し(const_cast))
182行: 182行:
  
  
まず、メンバ関数の引数はconstではないのに、呼び出す側のプログラムではconstになってしまっている場合。
+
===constポインタ変数→通常メンバ関数のポインタ変数(参照変数)引数===
 +
まず、メンバ関数の引数はconstではないのに、呼び出す側のプログラムではconstになってしまっている場合。これはメンバ関数を呼び出すときだけに限らず、通常のクラスではない関数の引数のときでも同じことなのですが、C++ではメンバ関数を多用しますので、基本的な作法として、一つ目の例としてもってきました。
  
 
例えばsample_main.cpp側で
 
例えばsample_main.cpp側で
273行: 274行:
  
  
(鋭意執筆中)
+
===constメンバ関数内からメンバ関数呼び出し===
 +
constメンバ関数内から通常のメンバ関数を呼び出すことはできませんが、これもconst_castによって回避することができます。まずは、constメンバ関数内から通常のメンバ関数が呼び出せない動作について確かめるためのプログラムを作ってみます。
  
 +
 +
サンプルは以下のとおりです。
 +
Const001.cpp(3つのメンバ関数の中身を変更しました。)
 +
<syntaxhighlight lang="cpp" line start="1">
 +
 +
省略
 +
 +
int CConst001::mfpubconst_Get_m_nValue() const{
 +
  int nValue = mfpub_Get_m_nValue();//★30.
 +
  printf("■mfpubconst_Get_m_nValue() const\n");
 +
  printf("nValue=%d\n",nValue);
 +
  return m_nValue;
 +
}
 +
 +
 +
int CConst001::mfpub_Get_m_nValue()      {
 +
  printf("■mfpub_Get_m_nValue()\n");
 +
  m_nValue = 10;★31.
 +
  return m_nValue;
 +
}
 +
 +
//★32.
 +
int CConst001::mfpub_Get_m_nValue() const{
 +
  printf("■mfpub_Get_m_nValue() const\n");
 +
  //m_nValue = 20;■constメンバ関数ではメンバ変数の変更は出来ない。
 +
  return m_nValue;
 +
}
 +
 +
省略
 +
 +
</syntaxhighlight>
 +
★30.部分でconstメンバ関数内から通常のメンバ関数を呼び出すようなつもりのプログラムを追記しました。
 +
 +
 +
それでsample_main.cppは変更せずに実行するとします。ちなみに、上記の変更について実際に呼び出しされる部分はこうでした。
 +
<syntaxhighlight lang="cpp" line start="1">
 +
 +
省略
 +
 +
int _tmain(int argc, _TCHAR* argv[])
 +
{
 +
 +
省略
 +
 +
  const CConst001* CConst001_constInstance = new CConst001;
 +
  CConst001_constInstance->mfpubconst_Get_m_nValue();
 +
 +
省略
 +
 +
}
 +
</syntaxhighlight>
 +
 +
そうすると、実行してみると以下のように出力されます。
 +
 +
実行結果
 +
<syntaxhighlight lang="text">
 +
■mfpubconst_Get_m_nValue() const
 +
■mfpub_Get_m_nValue() const
 +
nValue=-842150451
 +
</syntaxhighlight>
 +
という具合に、なります。★30.部分の記述では、動かないようなことを言っていたのに、あれ、呼び出せた?と一瞬思っちゃいますが、実はここでもconstにはconstを!の原理が働いています。
 +
 +
 +
'''int nValue = mfpub_Get_m_nValue();'''
 +
 +
 +
もし、mfpub_Get_m_nValue()による呼び出しができているとしたら、★31.が実行されてnValueの値は10になっているはずですが、出力ではまったく違う値になっています。実は予め用意していた、もう一方の★32.のconstメンバ関数が実行されています。
  
 
長い文章になってしまいましたが、概ねの説明は完了です。
 
長い文章になってしまいましたが、概ねの説明は完了です。

2015年5月14日 (木) 00:00時点における版



個人用ツール
名前空間

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