読者です 読者をやめる 読者になる 読者になる

constメンバ関数は重要

C++

私は基本的に、C++でソース書くときはやたらめったらconst付けます。
なぜならHaskellが好きだからです(ぇ
じゃなくて、状態の変更によるバグを減らすためです。


しかし、他人が書いたソースを見てると、オブジェクトのconst操作を考えて設計されてないことが
けっこうあり、Is〜とかGet〜といった名前の関数の中でメンバの状態を変更してたりします。

これはとくに、JavaC#のようなconstメンバ関数がない言語からC++に移植するようなときに
起こりやすいのですが、C++でもconstメンバ関数の存在を知ってか知らずかconstが付いてないことが多々あります。
書籍でいうと、『Game Programming Gems』では明らかにconst操作なメンバ関数にconst付いてないですね。


C++で大きなプログラムを組む際は、元となるコード(移植元やライブラリ)がオブジェクトのconst操作を考えて書かれていないと、
それを拡張していくときにconst操作な関数をconstにできなくて、状態変更している変数を
mutableにするかconst_castするかconst付けないかで悩むことになり、
私は多くの場合泣く泣くconst付けずに組んでいます。


バグというのは、意図しないところで状態が変更されることにより発生することが多く、
C++のconstメンバ関数は、メンバの状態が変更されないことを保証する、という強力なチェックを
提供してくれるので、mutableとconst_castという例外を除いてメンバの状態変更によるバグは起こりえません。


constメンバ関数はとても強力なので、const操作な関数には常にconst付けてほしいです。
というか、付けてくれないと本当に困るので付けてください。const付けてください。


ついでに、JavaC#のIDEは、Is〜、Get〜といった名前のメソッド内で状態変更してたら警告出してください。