C++でクラスを引数として渡す時には、大抵の場合ポインタで渡します。
これは実態で渡すとコピーが発生するのでオーバーヘッドが大きいためです。
でも、渡した先で中身を書き換えられると困る場合がありますので、
constをつけて、絶対汚さない宣言をしてあげると安心して渡すことが出来ます。
文字列を渡す時、const char *を使うのと同じ原理ですね。
さて、以下はC++のコードですが、改善点が一箇所あります。
class Foo{
int x;
public:
void set(int value){x = value;}
int get(){return x;}
Foo():x(0){}
};
どこがまずいかというと、以下のような使い方をした場合です。
void Hoo(const Foo *f){
int k = f->get();
}
ばっちりコンパイルエラーが出ます。
constが付いているので、メンバ変数を書き換えるset()が使えないのは仕方ないですが、
ただ値を見るだけのget()ですら内部を書き換える関数としてみなされてしまっています。
constが付いているポインタからもアクセスできるようにするにはこう書きます。
int get() const {return x;}
なお、宣言と実態を分割する場合は両方ともにconstが必要です。
int get() const;
int Foo:get() const {return x;}
そもそも、関数につけるconstを知らない人も多く、これがちゃんと守られているクラスはあまり見かけません。
ですが、これを怠るとconst_castがあちこちに現れる醜いコードになります。
メンバ変数/関数はprivate/publicを使い、適切にアクセス制限をしているのと同じく
constをつけてアクセス制限をつけてやれば、良いプログラムになると思います。
で、C#でこれがなくなったのがものすごくショック…代替構文があるのかな?