値クラスとインタフェースクラス

9/1,2の日記の中で書いたように、僕は、ヒープ上の変数(ポインタ)を使うべきか、スタック上の変数を使うべきかで悩んでいた。結局のところ、両方必要なようだ。

ある「インタフェース」のオブジェクトを別のオブジェクトに渡すときなどの場合、値渡しで渡すことはできない。したがって、ポインタとして渡すことになる。だからといって、9/1の日記で書いたようにすべてポインタにしてしまうのは、不便なことが多い。

ちなみに、Javaでは、基底型のみが値渡しになり、それ以外はポインタ渡しになる。しかし、Javaをやっていると、しばしば基底型以外も値渡しで渡したくなることもある。例えば、「数値のペア」のような単純なデータ構造のために、わざわざクラスを作ってポインタ渡しで渡すのはあまり気分が良くない。

C++では、もっと柔軟に値渡しをするのかポインタ渡しをするのか制御できるということが分かってきた。僕は、クラスを、値渡しで渡す「値」タイプのクラスと、それよりも複雑な構造をもつ「インタフェース」タイプのクラスに分類して考える。前者は、値渡しで渡すが、後者は、ポインタ渡しで渡すことになる。