Effective C++勉強メモ: Item 18 間違った使い方をしにくいインタフェース
リソース管理の部分は少し後回しで、項目をいくつか飛ばして18番目。
いいインタフェースとは、という項目で大きく分けて:
- 引数をClass/Struct化
- インタフェースは統一しよう
- 戻り値にスマートポインタを使おう
上記三点の話題が挙がっている。
引数をClass/Struct化
clas Date { public: Date(int month, int day, int year); };
のようなインタフェースだと順番を間違える可能性が非常に高いので
class Date { public: Date(const Month& m, const Day& d, const Year& y); };
のようにしよう(StructかClassとしてMonthを定義)。
インタフェースは統一しよう
単に自分の書くコードの間で統一されたインタフェースを持つだけでなく、built-inやstlともできるだけ合わせよう。例えばコンテナの大きさを返す関数はsizeにする、など。
戻り値にスマートポインタを使おう
ポインタを返すような関数(例えばファクトリー関数)はベストプラクティスとして使う側がすぐにスマートポインタ化することになる。それなら初めからスマートポインタを返すようなインタフェースにした方がいい、という話。
スマートポインタのメリットとしては、deleteの挙動がカスタム化できる(自前の破棄化関数をdeleteにbindできる)点と、元のオブジェクトがどのDLLから来ているのかをちゃんと記憶してdeleteもそこで走らせるのでDLL間でのオブジェクトのやり取りが問題なく行える、という二点もある。
ただし、
- 普通のポインタよりメモリを使う
- Virtual関数を使うことが多い
- heap allocationを使うことが多い
ということで生ポインタより多少でかいし遅い、というデメリットがある。それは理解した上で、それでもデフォルトではスマートポインタを使おう、というのが本の主張。