引数の値渡しは2つ方法があります。
値渡し
1つ目の方法は値を仮引数へ送る事です。
この方法は実引数の値を仮引数へコピーします。
その為、関数の中で引数の値をどんなに変更しても、関数呼び出し時に渡した実引数へは影響を及ぼしません
サンプルソース:
int OnInit(){
int tmp_int;
tmp_int = 0;
sub_function(tmp_int);
Print(tmp_int);
return 0;
}
void sub_function( int in_int ) {
in_int = 10;
}
参照渡し
2つ目の方法は値の参照渡しです。
この場合、実引数への参照(値では無い)が関数の仮引数へ渡されます。
関数の中では、関数の呼び出しで指定した実引数の値が使われます。
これは、関数内で仮引数の値を変更すると、呼び出し元で指定した実引数を変更する事を意味します。
参照渡しにするには、関数の引数の型の後ろにアンパサンド(&)を書きます。
サンプルソース:
int OnInit(){
int tmp_int;
tmp_int = 0;
sub_function(tmp_int);
Print(tmp_int);
return 0;
}
void sub_function( int &in_int ) {
in_int = 10;
}
MQL4では例外があり、
配列、構造体型変数、クラスオブジェクトは常に参照渡しになります。
参照渡しよって実引数の値に変化を及ぼす事を避ける為に
const修飾子を使用してください。
const修飾子で宣言された引数を変更しようとすると、コンパイラエラーになります。
サンプルソース:
int OnInit(){
int tmp_int[2];
tmp_int[0] = 0;
sub_function(tmp_int);
Print(tmp_int[0]);
return 0;
}
void sub_function( int in_int[] ) {
in_int[0] = 10;
}
void sub_function2( const int in_int[] ) {
in_int[0] = 10;
}
注意:
引数は逆の順番で関数に渡される事に注意しなければなりません。
すなわち初めに最後の引数が計算されて渡されます、
次に最後から2番目の引数が計算されてから渡されます、
次に最後から3番目の引数が計算されてから渡されます。
サンプルソース:
int OnInit(){
string str[]={ "A" ,"B" ,"C"};
int i=0;
i=0;
func(str[i],str[i++], string(i) );
func(str[i++],str[i], string(i) );
Print(i);
return 0;
}
void func( string par1, string par2, string par3) {
Print( par1 , par2 , par3);
}