トップ  >  リファレンス  >  基本  >  関数  >  関数のオーバーロード
スポンサーリンク
検索
カスタム検索
リファレンスツリー
オススメ
関数のオーバーロード


関数のオーバーロードは、同じ関数名で引数の型や引数の数が異なる関数を作成する事です。
引数の数や、引数の型が異なる関数はオーバーロードを意味します。

関数を呼ぶ時の実引数の型と、関数宣言の引数の一致に基づいて適切な関数を特定します。

サンプルソース:
int OnInit(){

    SubFunction(1);     // int_funcが表示される
    SubFunction(0.1);   // double_funcが表示される

    return 0;   
        
}


 
void SubFunction( double in_double ) {
    Print("double_func");
}


void SubFunction( int in_double ) {
    Print("int_func");
}


コンパイラは渡された実引数の型に従って、適切な関数を選択します。
シグネチャが一致したアルゴリズムが選択されます。
シグネチャは関数宣言において使われる型の事です。

コンパイラは曖昧な状況に対処する事が出来ません。
従って、関数宣言で使われていない型を実引数で渡して、暗黙的な変換に頼るべきではありません。
暗黙的な変換によりオーバーロード関数の選択が曖昧になります。
オーバーロード関数の適合に疑問を抱く動作となった場合、関数の実引数をキャストして対応する型に変換して下さい。

MQLが用意しているオーバーロード関数は、ArrayInitialize()の例でみる事が出来ます。


システム関数(例:MathMax())にオーバーロードする事が出来ます。
しかし、コンパイラが正確に必要な関数を選択出来る様にソースコードを書かなければなりません。

サンプルソース:

//システム関数 MathMax()の宣言内容
//double MathMax( double value1 , double value2);


// 1.オーバーロード可能
// 引数の数がMathMax()と異なるのでオーバーロード可能。
double MathMax(double a,double b,double c);
 
// 2. オーバーロード不可能
// 引数の数はMathMax()と異なりますが、
// 最後の引数がデフォルト値を持っています。
// システム関数を呼び出す時の隠蔽を導くので許可されません。
double MathMax(double a,double b,double c=DBL_MIN);
 
// 3.オーバーロード可能
// 引数の型が異なるのでオーバーロード可能。
double MathMax(int a,int b);
 
// 4. オーバーロード不可能
// 引数の数と型がシステム関数と同じです。
int MathMax(double a,double b);


管理人の勝手なコメント:
システム関数のオーバーロードは不具合の元になる可能性が高いので、良い子は止めましょう。
と、個人的に思います。


スポンサーリンク



Copyright ©2015 MT4でEA自作しちゃお〜 All Rights Reserved.


Top

inserted by FC2 system