関数

全てのタスクはサブタスクに分割することができ、それぞれが直接コードの形で表されるか更に小さいサブタスクに分割することが出来ます。このメソッドは段階的詳細化と呼ばれています。関数はサブタスク解決のコードを記述するために使用されます。関数が実行する内容を記述したコードは 関数定義と呼ばれます。

function_header
 {
  instructions
 }

最初のブレースの前にあるのは関数定義のヘッダのみで、ブレースに挟まれているのが関数定義の 本体 です。関数ヘッダーは、戻り値の型、名称(識別子)と仮パラメータの記述を含みます。関数に渡されるパラメータの数は限られており、64 を超えることは出来ません。

関数は、プログラムの他の部分から必要に応じて何回でも呼び出すことが出来ます。実際には、戻り値の型、関数識別子とパラメータ型が関数のプロトタイプを構成します。

関数プロトタイプは、関数宣言ではなく関数定義です。戻り型の明示的な宣言と引数の型のリストによって関数呼び出し時に厳密な型チェックと暗黙の型キャストが可能です。非常に多くの場合、コードの可読性を向上させるために関数の宣言はクラス内で行われています。

関数定義は、確実に宣言と一致する必要があります。宣言された関数は全て定義される必要があります。

例:

double                       // 戻り値の型
linfunc (double a, double b) // 関数名とパラメータリスト
 {
                            // 複合演算子
  return (a + b);           // 戻り値
 }

 

return 演算子は自己に含まれる式の値を返すことが出来ます。必要であれば、式の値は関数結果の型に変換されます。返せるものとしては、基本データ型基本構造体、及びオブジェクトポインタがあります。return 演算子は、配列、クラスオブジェクトや複合構造体の変数を返すことは出来ません。

値を返さない関数は void 型として記述されるべきです。

例:

void errmesg(string s)
 {
  Print("error: "+s);
 }

 

関数に渡されたパラメータは、その型の定数によって定義された初期値を持つことが出来ます。

例:

int somefunc(double a,
            double d=0.0001,
            int n=5,
            bool b=true,
            string s="passed string")
 {
  Print("Required parameter a = ",a);
  Print("Pass the following parameters: d = ",d," n = ",n," b = ",b," s = ",s);
  return(0);
 }

 

パラメータのいずれかが初期値を持つ場合、それ以降の全てのパラメータは、初期値を持たなければいけません。

下記は不正な宣言の例です。

int somefunc(double a,
            double d=0.0001,   // 初期値 0.0001 を宣言
            int n,             // 初期値が指定されていない
            bool b,             // 初期値が指定されていない
            string s="passed string")
 {                                          
 }          

参照

オーバーロード仮想関数ポリモーフィズム