C++ 仮パラメータの再定義

Abdul Mateen 2023年10月12日
  1. C++ での関数定義
  2. C++ での仮パラメータの再定義
C++ 仮パラメータの再定義

このチュートリアルでは、C++ での仮パラメーターの再定義の問題について説明します。

まず、関数の定義と仮パラメータについて説明します。 次に、仮パラメータの再定義の問題について説明します。

C++ での関数定義

プログラミングでは、パラメータと引数を交互に使用します。 ただし、形式的には、それらの間にほとんど違いはありません。

パラメーターは、関数ヘッダーの署名で関数名の後に続く括弧内に記述されます。 引数は、関数呼び出しで送信される値です。

注: 引数はパラメーターと呼ばれ、パラメーターは仮パラメーターと呼ばれることがあります。

さらに議論する前に、この用語を明確にすることが不可欠です。 それでは、以下の関数ヘッダーを見てみましょう。

void add (int a, int b)

add 関数のシグネチャを参照してください。 ここで、ab は仮パラメータです。

add 関数の呼び出しを参照してください。

int result = add(2, 5);

関数呼び出し内で、25 は関数に送信される引数ですが、ab 関数 add の仮パラメータはこれらの値を受け取ります。 仮パラメータの他に、ab は関数 add のローカル変数でもあることに注意することが重要です。

他のローカル変数と仮パラメーターの違いは、仮パラメーターは関数が呼び出されるたびに関数の外部から値を受け取ることです。 ただし、他のローカル変数は関数の外で値を受け取ることはできません。

別のコードを参照してください:

void add(int a, int b) {
  int result = a + b;
  cout << "Result: " << result << '\n';
}
add(2, 5);

このコード例では、2つの仮パラメーター (つまり、ab) と 3つのローカル変数 (つまり、resulta、および b) があります。 add 関数内では、3つの変数すべてを同様に使用できます。

これらの変数で入力を取得し、定数値または変数を割り当てて、それらを式で使用できます。

仮パラメータについて理解したら、次は仮パラメータの再定義の問題について話しましょう。

C++ での仮パラメータの再定義

C++ のプログラマーとして、同じスコープ内に同じ名前の 2つの変数が存在することはできないという考えを持っている必要があります。 たとえば、同じ名前のグローバル変数を宣言することはできません (型は関係ありません)。

同じクラスで同じ名前のデータ メンバーを宣言することはできません。 同様に、同じ名前の 2つのローカル変数を宣言することはできません。

理解を深めるために、次の例を見てみましょう。

int a;
char a;

コンパイル時に、このコードは次のエラーを返します。

redefinion1.cpp:6:6: error: conflicting declaration ‘char a’
 char a;
      ^
redefinion1.cpp:5:5: note: previous declaration as ‘int a’
 int a;

クラス定義における同様の問題:

class A {
  int a;
  int a;
};

コンパイル時に、このコードは次のエラーを返します。

redefinion1.cpp:9:6: error: redeclaration of ‘int A::a’
  int a;
      ^
redefinion1.cpp:8:6: note: previous declaration ‘int A::a’
  int a;

メッセージは異なるかもしれませんが、問題は同じです。つまり、2つの同じ名前の変数が同じスコープに存在することはできません。 ただし、異なるスコープで同じ名前の変数を持つことは可能です。

たとえば、次のコードはエラーなしでコンパイルされます。

#include <iostream>
using namespace std;

int a = 4;
void f() { cout << a << '\n'; }
int main() {
  int a = 3;
  cout << a << '\n';
  f();
  return 0;
}

このコードの出力は次のとおりです。

3
4

メイン関数では、ローカル変数 a のみが表示/アクセス可能です (グローバル変数は、このスコープ内のローカル a によって隠されています)。 したがって、cout ステートメントは、ローカル変数 a の値である 3 を出力します。

関数 f では、グローバル変数 a が表示/アクセス可能であり、print ステートメントはグローバル変数の値である 4 を出力します。

場合によっては、プログラマーが誤って、同じ名前の仮パラメーターとローカル変数の両方を使用してしまうことがあります。 この場合、両方が同じスコープに存在します。

したがって、コンパイラはエラーを生成します。

コードとコンパイラの応答を見てみましょう。

void f(int x) { int x = 4; }

出力:

redefinion1.cpp: In function ‘void f(int)’:
redefinion1.cpp:6:6: error: declaration of ‘int x’ shadows a parameter
  int x = 4;
      ^

上記のコードでは、関数 f には仮パラメーター x とローカル変数 x があり、どちらも関数 f のローカル変数です。 その結果、コンパイラ エラー declaration of 'int x' shadows a parameter が表示されます。これは、ローカル変数と仮パラメーターが同じ名前であることを意味します。

つまり、C++ のプログラマーとして、類似した名前のローカル変数を仮パラメーターとして宣言しないように注意する必要があります。 そうしないと、コンパイラはそれらを区別せず、エラーを生成します。

関連記事 - C++ Function