スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | --/--/-- --:--

const 修飾子の二重の意義

プログラミング関係は、完全に素人なので、つぶやき程度です。

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重の意義があることになります。

値渡しの場合は、
資料はコピーしてすぐにお返しするので、第一の意義はないのですが、
それでも第二の意義はあるということになります。

あくまでも素人考えです。
スポンサーサイト
C++プログラミング | コメント(0) | 2015/08/13 00:06
コメント

管理者のみに表示

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。