C++ での関数の引数とパラメータの違い
この記事では、C++ の関数の引数とパラメーターの違いについて説明します。
C++ での関数の構造
関数は、比較的洗練されたプログラムの一般的な構成要素です。これらにより、プログラム内の繰り返しルーチンを個別のブロックとして定義し、対応するコードを実行する必要があるときにそれらを呼び出すことができます。プログラムを複数の機能に分割すると、プログラムがよりモジュール化され、保守と理解が容易になります。したがって、これらのプログラムは通常、テストとデバッグが簡単です。
関数には通常、それらを一意に識別する名前が付いています。ただし、関数のオーバーロードなどの一部の概念では、プログラマーは同じ名前で複数の関数を定義できます。この機能については、後の段落で説明します。ラムダ式もミックスに含まれ、名前のない関数オブジェクトを定義する方法を提供します。関数ブロック内の異なるステートメントの合計は、関数本体と呼ばれます。関数には、呼び出し元に返される値の型を表す戻り型もあります。
関数のもう 1つの重要な部分は、関数のシグネチャの一部として宣言された変数を示すパラメーターのリストです。呼び出し元は通常、関数スコープでこれらの変数を初期化するためにいくつかの具体的な値を渡します。後者の値は引数と呼ばれ、関数のパラメーターの初期化子と呼ばれます。それでも、パラメータと引数という用語は、状況によっては同じ意味で使用される場合があります。
以下のサンプルプログラムでは、-printVector
という名前の関数を示しています。この関数の署名には、1つのパラメーター(vec
という名前)しか定義されていません。プロセスが main
関数で呼び出されると、vec1
引数がプロセスに渡されます。実行が printVector
関数本体に移動すると、vec
パラメーターは対応する値で初期化されます。
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
template <typename T>
void printVector(const vector<T> &vec) {
for (auto &i : vec) {
cout << i << "; ";
}
cout << endl;
}
int main() {
vector<int> vec1{11, 82, 39, 72, 51, 32, 91};
printVector(vec1);
return EXIT_SUCCESS;
}
出力:
11; 82; 39; 72; 51; 32; 91;
前の章で述べたように、C++ は関数のオーバーロードの概念をサポートしており、プログラマーは同じ名前で複数の関数を定義できます。ただし、これらの関数は、受け入れる引数の数または引数のタイプによって異なる必要があります。
以下のプログラムは、それぞれ int
または double
型の 2つの数値を乗算するオーバーロードされた関数の基本的な使用法を示しています。
#include <iostream>
using std::cout;
using std::endl;
int multiply(int x, int y) { return x * y; }
double multiply(double x, double y) { return x * y; }
int main() {
int i1 = 10;
double d1 = 0.1;
cout << multiply(i1, i1 + 1) << endl;
cout << multiply(d1, d1 + 1) << endl;
return EXIT_SUCCESS;
}
出力:
110
0.11