C++のクラス
C++のクラス記法があまり好きではない。
たとえばFooというクラスがあるとして、それをインスタンス化するには
Foo f;
と書く。この書き方は変数の宣言をしているだけのように見えるが、実はクラスのインスタンス化なのでコンストラクタが呼ばれる。コンストラクタに副作用がある場合は実行される。それが直感的ではないので、好きではない。
なお、コンストラクタに引数がある場合は
Foo f(10, 20);
などのように呼ぶ。この記法は一歩譲って許すとして、そうであるならば、コンストラクタが引数を取らない場合も
Foo f();
と書かせるならまだ分かる。しかし実際はこうではなく上に書いたように
Foo f;
だ。
new-deleteを使ってポインタを宣言してインスタンス化をする分には何の問題もない。ただこの場合はdeleteのし忘れによるメモリリークがあることに注意しなければならない。
不勉強でこの2種類のインスタンス化を区別する呼び方をよく知らないのだが、値型としてクラスをインスタンス化する方法は自分の直感に反する。さらに言えば、この変数がスコープを抜けた時にデストラクタが起動する。たとえば、関数のローカル変数として値型のオブジェクトを宣言すると、その関数から戻る直前に、deleteを呼んでいないにもかかわらずデストラクタが自動的に呼ばれる。デストラクタに副作用があったら意図せずに実行されてしまう。これも、明示的に書いていないところで何かが勝手に実行されるということで直感に反するのだが、こちらはメモリ解放を行うため思えばまだ分からないでもない。
私はC言語をやった後、C++をやらずにJavaに行ってしまったため、どうしてもJavaの癖がついてしまっていると思う。なので、普通にC++を勉強した人にとってはごく当たり前のことかもしれない。
たまにオープンソースプロジェクトのソースを読むことがあるのだが、C++では上記のような作法があるので、注意しなければならなかったという話。
C++のクラスについての話は、また後日全然関係ない話題で取り上げるつもり。