Cpp クラス const 新しいページはコチラ
提供: yonewiki
(→constメンバ関数内からメンバ関数呼び出し) |
(→constメンバ関数内からメンバ関数呼び出し) |
||
| 343行: | 343行: | ||
| − | もし、mfpub_Get_m_nValue()による呼び出しができているとしたら、★31.が実行されてnValueの値は10になっているはずですが、出力ではまったく違う値になっています。実は予め用意していた、もう一方の★32. | + | もし、mfpub_Get_m_nValue()による呼び出しができているとしたら、★31.が実行されてnValueの値は10になっているはずですが、出力ではまったく違う値になっています。実は予め用意していた、もう一方の★32.のconstメンバ関数が実行されています。これはconstオブジェクトではconstメンバ関数しか呼べないということの復習になるでしょうか? |
もちろん、constメンバ関数が用意されていなければ、コンパイルエラーになります。 | もちろん、constメンバ関数が用意されていなければ、コンパイルエラーになります。 | ||
| + | |||
| + | で、★31が実行されるには、★30.の部分の呼び出しがconstではないオブジェクトから呼ばれたことにすればよいことになります。そのようにするには以下のように★30.部分を書き換えます。 | ||
| + | Const001.cpp | ||
| + | <syntaxhighlight lang="cpp" line start="1"> | ||
| + | … | ||
| + | 省略 | ||
| + | … | ||
| + | int CConst001::mfpubconst_Get_m_nValue() const{ | ||
| + | int nValue = const_cast<CConst001*>(this)->mfpub_Get_m_nValue();//★40. | ||
| + | printf("■mfpubconst_Get_m_nValue() const\n"); | ||
| + | printf("nValue=%d\n",nValue); | ||
| + | return m_nValue; | ||
| + | } | ||
| + | … | ||
| + | 省略 | ||
| + | … | ||
| + | </syntaxhighlight> | ||
| + | ★40.部分のようにconst_castによって、クラスのthisポインタ変数の型をconst CConst001*型→CConst001*型に変換するようにすると、実行結果は以下のように変わります。 | ||
| + | |||
| + | |||
| + | 実行結果 | ||
| + | <syntaxhighlight lang="text"> | ||
| + | ■mfpubconst_Get_m_nValue() const | ||
| + | ■mfpub_Get_m_nValue() | ||
| + | nValue=10 | ||
| + | </syntaxhighlight> | ||
| + | になります。 | ||
| + | |||
| + | |||
| + | '''const_cast<CConst001*>(this)->mfpub_Get_m_nValue();''' | ||
| + | |||
| + | は | ||
| + | |||
| + | '''const_cast<const CConst001*>(this)->mfpub_Get_m_nValue();''' | ||
| + | |||
| + | |||
| + | に変更すると、またconstオブジェクトに戻るので、実行結果も元に戻ります。thisポインタに関する理解がなければ、この項目のconst外しサンプルはイマイチわからないものに感じるかもしれません。thisポインタに関する理解があれば、他にも呼び出す方法はあると思いつく人もいるかもしれません。 | ||