c++基礎学習の関数とパラメータ

3499 ワード

1.伝達パラメータ
//    

int Abc(int a,int b,int c)

{

    return a+b+b*c+(a+b-c)/(a+b)+4;

}

a,b,cは関数Abcの形式パラメータformal parameterであり,タイプはいずれも整数である.関数A b cが次の文で呼び出された場合:
z = Abc(2,x,y)

では,2,x,yはそれぞれa,b,cに対応する実際のパラメータである.
A bc(2,x,y)が実行されると、aは2に割り当てられる.bはxに割り当てられる.cはyに割り当てられる.xおよび/またはyがintタイプでない場合、それらの値をbおよびcに割り当てる前に、まずそれらをタイプ変換する.上記のプログラムでは、形式パラメータa,b,cはいずれも伝値パラメータ(value parameter)である.
実行時に、伝達形式パラメータに対応する実際のパラメータの値は、関数の実行前に形式パラメータにコピーされ、コピープロセスは、この形式パラメータが属するデータ型のコピー構造関数(copy constructor)によって完了します.実際のパラメータが形式パラメータのデータ型と異なる場合は、タイプ変換を行い、実際のパラメータのタイプから形式パラメータのタイプに変換する必要があります.もちろん、このようなタイプ変換が許容されると仮定します.関数の実行が終了すると、形式パラメータが属するデータ型の構造関数(destructor)が形式パラメータを解放します.関数が返されると、形式パラメータの値は対応する実際のパラメータにコピーされません.したがって、関数呼び出しは実際のパラメータの値を変更しません.
2.テンプレート関数
//    

template<class T>

T Abc(T a, T b, T c)

{

    return a+b+b*c+(a+b-c)/(a+b)+4;

}

この汎用コードを用いて,Tをintに置き換えることで,コンパイラは直ちにプログラム計算整形を構築し,Tをfloatに置き換えるとプログラム処理浮動小数点型を直ちに構築することができる.実際,Tをdoubleまたはlongに置き換えることで,コンパイラは関数Abcの二重精度バージョンと長整数バージョンを構築することができる.関数Abcをテンプレート関数として記述することで,形式パラメータのデータ型を理解する必要がなくなる.
3.参照パラメータ
形式パラメータの使用により、プログラムの実行オーバーヘッドが増加します.
関数が呼び出され,返されるときの動作を考察する.a,b,cが伝達パラメータであると仮定し、関数が呼び出されると、タイプTの複製構造関数は、対応する実際のパラメータを形式パラメータa,b,cにそれぞれコピーし、関数の使用に供する.一方、関数が戻ると、タイプTの構造関数が起動され、形式パラメータa,b,cが解放される.
//    

template<class T>

T Abc(T& a, T& b, T& c)

{

    return a+b+b*c+(a+b-c)/(a+b)+4;

}

上記のプログラムに示すコードでは、a,b,cは参照パラメータ(reference parameter)である.関数Abcが文Abc(x,y,z)で呼び出され、x,y,zが同じデータ型である場合、これらの実際のパラメータにはa,b,cの名前がそれぞれ与えられるので、関数Abcの実行中に対応するa,b,cを置換するためにx,y,zが用いられる.伝達パラメータの場合と異なり,関数が呼び出された場合,本プログラムは実際のパラメータの値をコピーせず,関数が返された場合も構造関数を呼び出さなかった.したがって、パラメータのコピーに値伝達パラメータを使用する場合に必要な操作を節約できます.
4.定数参照パラメータ
このモードでは、関数が参照パラメータを変更できないことを示します.
//      

template<class T>

T Abc(const T& a, const T& b, const T& c)

{

    return a+b+b*c+(a+b-c)/(a+b)+4;

}

キーワードconstを使用して、関数が参照パラメータの値を変更できないことを示すことは、ソフトウェアエンジニアリングにおいて重要な意味を持つ.これにより、関数が実際のパラメータを変更しないことがすぐにユーザーに通知されます.