多重定義の例
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/09 03:43 UTC 版)
C++による多重定義: // (1-1): 引数の数の違いによる多重定義int Function(void);int Function( int value );int Function( int value0, int value1 );// (2): 引数の修飾子の違いによる多重定義int Function( int *value );int Function( int const *value );int Function( int *const *value );int Function( int *const *const *value );// (3): 引数の型の違いによる多重定義int Function( char value );int Function( std::complex< double > const &value );int Function( ... ); // ※1template< class Type > int Function( Type const &value ); // ※2struct Example{ // (1-2): 引数の型の違いによる多重定義(コンストラクター版) Example(void); Example( int value ); // (4): メンバー関数の修飾子の違いによる多重定義 int Function(void); int Function(void) const; // (1-3): 引数の型の違いによる多重定義(メンバー関数版) int Function( int value ); // (5): 戻り値の型の違いによる多重定義 operator bool (void) const; operator int (void) const;}; 基本的には「(1)引数の数」と「(2)修飾子」「(3)型」が異なっていれば関数に同じ名前を付けられるようになっている。また、大域関数で可能な多重定義はメンバー関数で全て可能である。メンバー関数は更に「(4)修飾子の違い」による多重定義と変換演算子を用いた時に限り可能な「(5)戻り値の型の違い」による多重定義が可能になっている。JavaやC#などC++以外の言語では(1)と(3)の範囲にとどまっている事が多い。C++で特に特徴的なのは※1の省略子と※2のテンプレート関数を多重定義できる点である。省略子を引数にとる関数はあらゆる引数を受け付ける関数である。引数の型や数を無視する反面、関数の内部では一切引数を参照することができない。テンプレート関数はint等明示的に型を書いた関数より選択される優先度が低く、省略子を用いた関数は更に低い。この特性を利用して同じ扱いで処理できる型はテンプレート関数で処理、特別扱いが必要な型であれば明示的に型を書いた関数で処理、引数の数が異り多重定義した関数群では対処しようがない引数は省略子を用いた関数を使って何もしない等既定の処理をさせるようにすることができる。 FORTRANによる多重定義: module Example implicit none ! Function0, Function1をFunctionとして定義。FORTRANに予約語はなくFunctionは予約語ではない。 interface Function module procedure Function0, Function1 end interface Functioncontains function Function0( value1 ) result( value0 ) !省略 end function Function0 function Function1( value1, value2 ) result( value0 ) !省略 end function Function1end module Example 特徴的なのは関数の定義としては多重定義を認めないものの呼び出し方法として多重定義を認めている点である。呼び出し時の名前と定義の名前は別物であるため混乱の原因となるだけではあるが全く別の名前をつける事も可能になっている。
※この「多重定義の例」の解説は、「多重定義」の解説の一部です。
「多重定義の例」を含む「多重定義」の記事については、「多重定義」の概要を参照ください。
- 多重定義の例のページへのリンク