トップ  >  リファレンス  >  基本  >  関数  >  引数の値渡し
スポンサーリンク
検索
カスタム検索
リファレンスツリー
オススメ
引数の値渡し


引数の値渡しは2つ方法があります。

1つ目の方法は値を仮引数へ送る事です。
この方法は実引数の値を仮引数へコピーします。
その為、関数の中で引数の値をどんなに変更しても、関数呼び出し時に渡した実引数へは影響を及ぼしません

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

    int tmp_int;
    tmp_int = 0;
    
    sub_function(tmp_int);
    Print(tmp_int);           // 0 表示

    return 0;   
        
}


void sub_function( int in_int ) {

    in_int = 10;                    // 仮引数の値に10を代入

}


2つ目の方法は値の参照渡しです。
この場合、実引数への参照(値では無い)が関数の仮引数へ渡されます。
関数の中では、関数の呼び出しで指定した実引数の値が使われます。
これは、関数内で仮引数の値を変更すると、呼び出し元で指定した実引数を変更する事を意味します。

参照渡しにするには、関数の引数の型の後ろにアンパサンド(&)を書きます。
サンプルソース:
int OnInit(){

    int tmp_int;
    tmp_int = 0;
    
    sub_function(tmp_int);
    Print(tmp_int);           // 10 表示

    return 0;   
        
}


void sub_function( int &in_int ) {

    in_int = 10;                    // 仮引数の値に10を代入

}


MQL4では例外があり、
配列、構造体型変数、クラスオブジェクトは常に参照渡しになります。
参照渡しよって実引数の値に変化を及ぼす事を避ける為にconst修飾子を使用してください。

const修飾子で宣言された引数を変更しようとすると、コンパイラエラーになります。

サンプルソース:

int OnInit(){

    int tmp_int[2];
    tmp_int[0] = 0;
    
    sub_function(tmp_int);
    Print(tmp_int[0]);                 // 10 表示

    return 0;   
        
}


void sub_function( int in_int[] ) {    // 配列は強制的に参照渡しになる

    in_int[0] = 10;                    // 仮引数の値に10を代入

}

void sub_function2( const int in_int[] ) {

    in_int[0] = 10;                    // エラー。const修飾子のついた仮引数は変更出来ない

}


注意:
引数は逆の順番で関数に渡される事に注意しなければなりません。
すなわち初めに最後の引数が計算されて渡されます、
次に最後から2番目の引数が計算されてから渡されます、
次に最後から3番目の引数が計算されてから渡されます。

サンプルソース:

int OnInit(){

    string str[]={ "A" ,"B" ,"C"};
    int i=0;
    
    i=0;
    func(str[i],str[i++], string(i) );
    // BA0が表示される
    // 最初に第3引数の式が計算される。iの値は0のまま。
    // 次に第2引数の式が計算される。  
    //   後置きインクリメントなので引数が渡されてから(i=0)、iがインクリメントされる。
    // 次に第1引数の式が計算される。  第2引数の式でiがインクリメントされているのでiの値は1。

    // この時点でiの値は1。    
    
    func(str[i++],str[i], string(i) ); 
    // BB1表示
    // 最初に第3引数の式が計算される。iの値は1のまま。
    // 次に第2引数の式が計算される。  iの値は1のまま。
    // 次に第1引数の式が計算される。  
    //   後置きインクリメントなので引数が渡されてから(i=1)、iがインクリメントされる。

    Print(i);
    // 2が表示される

    return 0;   
        
}


 
void func( string par1, string par2, string par3) {
   Print( par1 , par2 , par3);
}



スポンサーリンク



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


Top

inserted by FC2 system