引数の参照渡し
MQL4では
シンプルな型の引数は、値渡しと参照渡しのいずれかの方法で渡す事が出来ます。
複雑な型の引数は常に参照渡しになります。
引数を参照渡しにするには、引数名の前に&修飾子を追加してコンパイラに知らせる必要があります。
引数の参照渡しは、変数のアドレスを渡す事を意味します。
参照によって渡された引数の値が変更された場合、参照元の変数に変更内容が反映されます。
参照によって渡された引数の変更を防止するには、
const修飾子を使用します。
関数の引数が
配列・構造体・クラスオブジェクトの場合、
関数ヘッダの変数の型の後に&修飾子を付けます。
上記サンプルソースで、CDemoClass
クラスが宣言され、このクラスには
double型のm_array[]配列の
privateメンバが含まれています。
setArray()関数が宣言され、引数のarray[]配列は参照によって渡されます。
関数ヘッダで参照渡しについての指示(&修飾子)が無い場合、
コンパイラはコンパイル時エラーメッセージを生成します。
this
クラス型(オブジェクト)の変数は、参照渡しとポインタ渡しのいずれかの方法で渡す事が出来ます。
ポインタは参照渡しと同様に、オブジェクトへのアクセスが出来ます。
this(予約語)は、自身のオブジェクトへの参照を行う為にあります。
これはクラス内や構造体メソッド内で使用可能です。
thisは常にオブジェクト参照します。
MQL4関数はオブジェクトを返す事は出来ませんが、オブジェクトポインタを返す事は出来ます。
GetPointer(this)でオブジェクトポインタを返す事が出来ます。
サンプルソース:
class CDemoClass {
private:
public:
CDemoClass *getDemoClass();
};
CDemoClass *CDemoClass::getDemoClass(void) {
return( GetPointer( this ) );
}
void OnStart(){
CDemoClass* p_obj;
CDemoClass* p_this;
p_obj = new CDemoClass();
p_this = p_obj.getDemoClass();
printf("p_objアドレス:%d , p_thisアドレス:%d",p_obj,p_this);
delete(p_obj);
}
結果:
test_script EURUSD,M5: p_objアドレス:1 , p_thisアドレス:1
構造体はポインタを持っていません。
その為、構造体に対して
new演算子・
delete演算子・
GetPointer(this)を使用する事は出来ません。