1-12-0. 関数

公開日: 15:42 1. 基本編/1-12. 関数/1-12-0. 関数

関数(function)はともにtaskを実行する構文のまとまりです。C++のプログラムはそれぞれ最低でも1つのmain()関数を持ち、ほとんどのプログラムは追加の関数を定義しています。

コードは別々の関数に分けることができます。それぞれの関数にどの程度コードを分けるかはプログラマ次第ですが、必然的に、一般的な分割は特定のタスクを実行する関数ごとになります。 

関数宣言はコンパイラに関数名、返り値、引数を伝えます。関数定義は関数の中身を供給します。

C++標準ライブラリにはプログラムで呼び出すことのできる多数の組み込み関数が用意されています。例えば、2つの文字列を連結するstrcat()関数、あるメモリ領域から別の領域へコピーするmemcpy()関数などがあり、他にもたくさんの関数があります。 関数は様々な呼び名があり、メソッド(method、手段)、サブルーチン、手続き(procedure)などがあります。

関数の定義

C++での関数定義の一般的な形式は次のようになります。
return_type function_name( parameter list )
{
   body of the function
}
C++の関数定義はヘッダとボディで構成されます。 
  • 戻り値: 関数は値を返す事があります。戻り値は関数が返す値のデータ型です。関数によっては値を返すことなく望まれた命令を実行します。その場合、戻り値の型はvoidキーワードになります。
  • 関数名: これは実際の関数の名前です。関数名と引数リストで関数の署名を構成します。
  • 引数: 引数は関数が呼びだされた時、値を引数に渡します。この値は実パラメータまたは実引数と呼ばれます

引数リストは関数に渡す引数の型、順番、引数の数を指します。引数は必要に応じてであり、つまり、関数は引数を含まないこともあります。 関数部:関数部は関数が何をするか定義した構文の集合です。

次のソースコードはmax()という名前の関数です。この関数は2つの引数num1とnum2を取り、2つのうちの最大を返します。
// 2つの数字の最大を返す関数
 
int max(int num1, int num2) 
{
   // ローカル変数の宣言
   int result;
 
   if (num1 > num2)
      result = num1;
   else
      result = num2;
 
   return result; 
}

関数宣言

関数宣言はコンパイラに関数名と、どのように関数を呼び出すかを伝えます。関数の本 体とは別々に定義できます。 関数宣言は次のような要素を持ちます。
return_type function_name( parameter list );
上の関数max()の定義のために、次のように関数を定義します。
int max(int num1, int num2);
関数宣言内では方が要求され引数名は重要ではなく、次の宣言は有効です。
int max(int, int);
関数宣言はあるソースファイルで関数を定義し、その関数を別のファイルで呼び出すときに必要です。そのような場合、関数を呼び出すファイルの先頭で関数 を宣言する必要があります。

関数の呼び出し

関数を作成する時、関数がするべきことを定義しなければなりません。関数を使うには、関数を呼び出したり、起動する必要があります。

プログラムが関数を呼び出した時、プログラムの制御は呼び出された関数に移ります。呼びだされた関数は定義されたタスクを実行し、return構文が実行または関数 の終わりである}に到達すると、メインプログラムに構文が制御を返します。

関数を呼び出すためには、関数名に沿った引数を渡す必要があり、関数が値を返すのであれば、返された値を保持します。
#include <iostream>
using namespace std;
 
// 関数宣言
int max(int num1, int num2);
 
int main ()
{
   // ローカル変数の宣言
   int a = 100;
   int b = 200;
   int ret;
 
   // 最大値を求める関数の呼び出し
   ret = max(a, b);
 
   cout << "最大値は : " << ret << endl;
 
   return 0;
}
 
// 2つの数字の最大を返す関数
int max(int num1, int num2) 
{
   // ローカル変数の宣言
   int result;
 
   if (num1 > num2)
      result = num1;
   else
      result = num2;
 
   return result; 
}
ソースコードをコンパイルし実行するとつぎの結果が得られます。
最大値は : 200

関数の引数

関数が引数を取る場合、引数の値を受け取る変数を宣言しなければなりません。これらの変数は関数の仮引数と呼ばれます。

仮引数は関数内のローカル変数のように振るまい、関数内へ入る前に生成され、抜けるときに破棄されます。

関数を呼び出している間、引数を関数に渡すには2つの方法があります。
呼び出し型説明
値渡しこの方法は仮引数へ引数の値をコピーします。この場合関数内で変更された引数は元の引数に影響しません
ポインタ渡しこの方法は仮引数へ引数のアドレスをコピーします。ポインタは関数内で使われる値にアクセスするのに使われます。これは引数の変更が元の引数に影響することを意味します
参照渡しこの方法は仮引数へ引数の参照をコピーします。参照は関数内で使われる値にアクセスするのに使われます。これは引数の変更が元の引数に影響することを意味します

デフォルトで、C++は引数を渡すのに値渡しを使います。これは一般的に、関数内のコードは関数内の呼び出しに使われた引数を変更しないことを意味し、上に示した例のmax()関数の呼び出しは同じ方法で使われています。

デフォルト引数

関数を定義するとき、それぞれの引数にデフォルトの引数を指定することができます。この値は関数を呼び出すときに対応する引数が空白のままの時に使われます。

これは関数定義で代入演算子を使い値を引数に割り当てることで行います。関数呼び出し時に引数に値が渡されなければデフォルトで与えられた引数が使われますが、値を指定すれば、デフォルトの値は無視され代わりに指定した値が使われます。 次の例を見ていきます。
#include <iostream>
using namespace std;
 
int sum(int a, int b=20)
{
  int result;

  result = a + b;
  
  return (result);
}

int main ()
{
   // ローカル変数の宣言
   int a = 100;
   int b = 200;
   int result;
 
   // 関数の呼び出し
   result = sum(a, b);
   cout << "Total value is :" << result << endl;

   // bを指定しないで呼び出し
   result = sum(a);
   cout << "Total value is :" << result << endl;
 
   return 0;
}
上のコードをコンパイルし実行すると、次の結果が得られます。
Total value is :300
Total value is :120
  • ?±??G???g???[?d????u?b?N?}?[?N???A

0 件のコメント :

コメントを投稿