改めて前回の内容をおさらいをしておくと、
ということをお伝えしました。
今回は 値渡し についてお話ししたいと思います。
値渡しは次回取り上げる参照渡しと対になっている概念になります
値渡し・参照渡し とは?
値渡し・参照渡しという、この謎の言葉たちなんですが(「値」を渡すは、100歩譲るとして、「参照」を渡すってなんだよ(; ・`д・´))
今回と次回の話(値渡し・参照渡し)というのは、関数の使い方に関連したものです。
※この講座もだいぶ、回数を重ねてきましたが、関数については大丈夫でしょうか?
関数について復習されたい方は、↓の記事をご覧ください。
関数の書式構造をもう一度おさらいしておくと、↓
データ型 関数名 (引数1,引数2,引数3・・・)
{
//処理記述
}
こんな感じになっていましたね?
引数(パラメーター)の記述方法の種類
だと思ってもらったら結構です。
引数についての前提
関数の各引数(パラメーター)にはデータ型が設定されていて、関数を使う際には、引数に設定されている種類のデータを記述しなくてはいけません。
洗濯機がもし関数だったとして、洗濯槽に入れるのはもちろん衣類ですよね。(電子レンジのように食べ物を温めようと食材をぶち込んだら壊れるか大惨事になるかのどちらかです)
「第1引数にはint型を入れてくださいねー、第2引数にはdouble型を入れてくださいねー」
という決まりが、組み込み関数であれば事前に設定されていますし、自分で関数を作るときにもその設計はしなくてはいけません。
※引数を設定せず()内に何も入力しない場合は別ですが、関数宣言時にデータ型を指定しないで変数を入力すると
「 declaration without type 」(和訳:データ型がない状態で宣言しています)
というコンパイルエラーが発生します。↓
引数(パラメーター)には、定められたデータ型に従った値(を格納している変数や、それを算出する式や関数など)を入れる
まずはこの前提を押さえたうえで、この先を読み進めてもらえたらと思います。
値渡しについて
繰り返しになりますが、値渡しというのは、
関数の引数(パラメーター)に、値のコピーを渡す記述方法の1つになります。
コピーなので、関数内での処理がどのようなものであれ、元々の値には一切影響がありません。
void OnStart()
{
string varString="こんにちわー";
//exampleFuncton関数を呼び出し、実引数にvarStringを設定
exampleFuncton(varString);
}
//関数「exampleFuncton」を宣言し、仮引数を文字型「passingByValue」に設定
void exampleFuncton(string passingByValue)
{
//仮引数「passingByValue」に"こんばんわー"を代入
passingByValue="こんばんわー";
//ログ出力
Print(passingByValue);
}
順を追ってみていきましょう。
まず関数の宣言と実装部分ですが、
void型(戻り値なし)のデータ型で、関数名が「exampleFuncton」となっています。
引数(パラメーター)には、string型を設定し、仮引数の名前は「passingByValue」としました。
仮引数について
※仮引数については、第25回「関数について」 の補足欄にも書いてあります。
あくまで実際に関数を使う際の、ガイダンスとして設定しているもので、実際にイベントハンドラーなどのメインプログラムで関数を呼び出すときに関数の()内に記述する値を「実引数」といいます。
サンプルコードで言えば、
仮引数→関数宣言時に記述した「passingByValue」
実引数→OnStart関数内で記述した「varString(=そこに格納されている”こんにちわー”)」
となります。
void exampleFuncton(string passingByValue)//←これは仮引数
//------------------------------------------------------------
string varString="こんにちわー";
exampleFuncton(varString);//←これは実引数
宣言した「exampleFuncton」関数にどのような機能を付与したかを改めて確認していきましょう。
void exampleFuncton(string passingByValue)
{
//仮引数「passingByValue」に"こんばんわー"を代入
passingByValue="こんばんわー";
//ログ出力
Print(passingByValue);
}
- 引数(パラメーター)にstring型(文字列型)を指定する。
- 指定したstring型(文字列型)の引数に”こんばんわー”を代入する。
- 代入したstring型(文字列型)の引数に格納されている値をログ出力する
以上の機能を持った関数になります。
OnStart関数内でよびだした「exampleFuncton」関数の()内には、string型(文字列型)の値(実引数)が必要ですから、変数「varString」を記述しました。
変数「varString」には、初期値として”こんにちわー”が格納されています。
このMQL5 Program Fileをチャートに挿入して実行してみると・・・
???「こんばんわー」とログ出力されていますね。
「exampleFuncton」関数の()内には、“こんにちわー”が格納されている変数「varString」を記述しているはずなのに・・・
でも、なにも不思議なことはないんです。
「exampleFuncton」関数の役割は
- 引数(パラメーター)にstring型(文字列型)を指定する。
- 指定したstring型(文字列型)の引数に”こんばんわー”を代入する。
- 代入したstring型(文字列型)の引数に格納されている値をログ出力する
でしたよね?
もっと簡単に言えば“こんばんわー”とログ出力するための関数なわけです。
つまり、
変数「varString」に格納されている文字列が”こんにちわー”だろうと”馬鹿野郎ー”だろうが、
「exampleFuncton」関数を呼び出せば、”こんばんわー”としかログ出力されない。
ということです。
それでは、変数「varString」に格納していた初期値“こんにちわー”はどうなっているのでしょうか?
“こんばんわー”に変わっているのでしょうか?↓
まとめ
今回は 値渡し について解説しました。
今回の記事では以下のことを学びました。
- コピーを渡しているので、関数内での処理がどのようなものであれ、元々の値には一切影響がない。
今回は以上になります。
最後までお読みいただきありがとうございました<m(__)m>
コメント