const 修飾子の二重の意義
プログラミング関係は、完全に素人なので、つぶやき程度です。
C++ で関数の引数に const 修飾子をつける時の意義って、
考えてみると意外に深いです。
参照渡しの引数につける場合。
たとえば、Matrix という行列を扱うクラスがあったとして、
そのオブジェクト A の参照を渡して、その行列式を返す関数。
行列の場合、データが膨大になるので、コピーして値渡しするよりは、
参照渡しの方が効率的。
この時、行列式を計算して値を返すだけなので、
行列の中身は変更しないということを const で保証しています。
このように定義することで、関数を呼び出す時に、
勝手に内容を変更される心配がなく、呼び出し側が安心して使える
という意義がありますね。
では、値渡しの場合はどうでしょう?
たとえば、2つのdouble型の数を比較して、大きい方を返す関数。
上記の意義だけだと、値渡しに const をつけても、
何の意義もないということになります。
なぜなら、値渡しの場合は、関数内では値だけコピーして使用するのだから、
呼び出した側の内容が変更されようがありませんよね。
しかし、それでも意義はあるように思います。
呼び出し元の内容を変更する心配はないにせよ、
実際に大小比較する前に、うっかり間違えて変更してしまったら、
この関数自体が機能しません。
const をつけることによって、うっかり変更してしまった場合には
コンパイルエラーが発生するため、バグを防げるという効果があると思います。
つまり、関数を正しく機能させるために、プログラムミスで変更してしまうのを防ぐ
という意義がありますね。
たとえるならば、参照渡しの場合は、
(1) 社外から貴重な資料を預かってきているので、
それを絶対に汚してはいけない
(2) 社内的にも汚してしまったら、
調べたかった情報が得られないので、
絶対に汚してはいけない
という2重の意義があることになります。
値渡しの場合は、
資料はコピーしてすぐにお返しするので、第一の意義はないのですが、
それでも第二の意義はあるということになります。
あくまでも素人考えです。
C++ で関数の引数に const 修飾子をつける時の意義って、
考えてみると意外に深いです。
参照渡しの引数につける場合。
たとえば、Matrix という行列を扱うクラスがあったとして、
そのオブジェクト A の参照を渡して、その行列式を返す関数。
double det (const Matrix& A);
行列の場合、データが膨大になるので、コピーして値渡しするよりは、
参照渡しの方が効率的。
この時、行列式を計算して値を返すだけなので、
行列の中身は変更しないということを const で保証しています。
このように定義することで、関数を呼び出す時に、
勝手に内容を変更される心配がなく、呼び出し側が安心して使える
という意義がありますね。
では、値渡しの場合はどうでしょう?
たとえば、2つのdouble型の数を比較して、大きい方を返す関数。
double max ( const double a, const double b);
上記の意義だけだと、値渡しに const をつけても、
何の意義もないということになります。
なぜなら、値渡しの場合は、関数内では値だけコピーして使用するのだから、
呼び出した側の内容が変更されようがありませんよね。
しかし、それでも意義はあるように思います。
呼び出し元の内容を変更する心配はないにせよ、
実際に大小比較する前に、うっかり間違えて変更してしまったら、
この関数自体が機能しません。
const をつけることによって、うっかり変更してしまった場合には
コンパイルエラーが発生するため、バグを防げるという効果があると思います。
つまり、関数を正しく機能させるために、プログラムミスで変更してしまうのを防ぐ
という意義がありますね。
たとえるならば、参照渡しの場合は、
(1) 社外から貴重な資料を預かってきているので、
それを絶対に汚してはいけない
(2) 社内的にも汚してしまったら、
調べたかった情報が得られないので、
絶対に汚してはいけない
という2重の意義があることになります。
値渡しの場合は、
資料はコピーしてすぐにお返しするので、第一の意義はないのですが、
それでも第二の意義はあるということになります。
あくまでも素人考えです。
スポンサーサイト
コメント