2006-06-03
久々の更新ですが、今回は関数の多重定義について書いてみることにします。多重定義については、
「C結合と多重定義」の回にも触れましたので、今回はもう少し初歩的な話題にしたいと思います。
C言語では、やりたいことの意味が同じでも、引数の型や個数が異なれば、別の関数名を付けるしかありませんでした。具体的には、絶対値を求める関数は、引数がint型であればabs、long型であればlabs、double型であればfabsというように、型を表すための接頭辞を関数名につけていました。
C++では、このような場合には関数の多重定義を行うことができます。多重定義というのは、引数の型や個数が異なれば、同じ名前の関数をいくつでも定義できる機能です。実際、標準C++では、labsやfabs関数以外にも、<cstdlib>ヘッダでは、long用のabsやdouble用のabsなどが多重定義されます
*1。
多重定義は、引数の型と個数を元に、実際にどの関数を呼び出すべきかをコンパイラが決定します。このとき、型と個数が完全に一致すればよいのですが、何らかの型変換が必要になる場合は、どの関数を呼び出せばよいのか曖昧になる場合があるので要注意です。
また、前回お話した省略時実引数の解決も、多重定義と絡んできます。実引数を省略した結果、同名の関数と曖昧になる可能性もあります。
注意点ばかりですが、もう一つ注意しておくと、後から同名の関数を多重定義すると、それまで呼び出していた関数とは別の関数を、意図に反して呼び出してしまうことがあります。これは、ステップ実行してみて始めて気付くバグになることもあるので、曖昧さをもたらすような仮引数は設けない方が無難です。charやshort型と、int型の引数を多重定義すると、この問題が比較的発生しやすいのではないかと思います。
*1 この仕様を満たしている処理系は意外に少ないので要注意です。
Comment