変数をすべてポインタにするという案

最近C++の引数渡し方式に慣れてきた(関数はとにかくconstリファレンスで受ける。。。)。オブジェクトがどこでどう作られ、どのように変数に代入されるかを把握できたら、これはこれで自然にも思う。ただ、Javaプログラミングに比べて、プログラミング中に考えなければいけないことは倍になった。

で、ふと思ったのだが、そもそもC++の流儀に従う必要があるのかを良く検討した方が良いかもしれない。今まで、C++の引数渡し方式とその弊害について、散々日記で書いていたが、実際にC++Javaの引数渡しの仕組みを取り入れることについては、まじめに検討していなかった。

自作のクラスを以下の方式で統一するというのはどうだろうか。コンストラクタ、コピーコンストラクタをprotectedにし、それとは別にstaticなオブジェクト生成用メソッド(オブジェクトをnewで生成してそのポインタを返す)を用意する。そうすると、変数はすべてポインタを指すようになる(Javaなどと同じになる)。

オブジェクトは、スタックではなく、すべてヒープ上にできることになる。パフォーマンスは若干悪くなるかな。そして何より、スコープを外れた変数のメモリ解放を自分でやらなければいけなくなる。しかし、その代わり、「一時オブジェクト」がバカバカできることもないし、リファレンスを付け忘れたり(付けすぎたりして)おかしくなるということがない。

これはまともに動くのか?C++には様々な落とし穴がある。これにより新たな落とし穴が出てくるようなことがあったら、まったく使えないアイデアということになる。しかし、所詮Javaと同じになるということなので、無難に動きそうな気もする。

これはC++プログラミングの必勝形になり得るか?メモリを勝手に解放してくれるという、スタックのありがたみがなくなるというのは、後々どこかに効いてくるかもしれない。また、constとの相性はどうだろうか。Javaでは、ポインタしかconstできないが、C++では、ポインタを指すものをconstにできる。この方式を採用することで、その恩恵が減るようなことはないだろうか。