형식 매개변수의 C++ 재정의

Abdul Mateen 2023년10월12일
  1. C++의 함수 정의
  2. C++에서 형식 매개변수의 재정의
형식 매개변수의 C++ 재정의

이 튜토리얼에서는 C++의 형식 매개변수 재정의 문제에 대해 논의합니다.

먼저 함수 정의 및 형식 매개변수에 대해 설명합니다. 다음으로 형식 매개변수의 재정의 문제를 다룰 것입니다.

C++의 함수 정의

프로그래밍에서는 매개변수와 인수가 번갈아 사용됩니다. 그러나 형식적으로는 차이점이 거의 없습니다.

매개 변수는 함수 헤더의 서명에서 함수 이름 뒤에 오는 괄호 안에 작성됩니다. 인수는 함수 호출과 함께 전송되는 값입니다.

참고: 때로는 인수를 매개변수라고 하고 매개변수를 형식 매개변수라고 합니다.

더 논의하기 전에 이 용어를 명확히 하는 것이 중요합니다. 그럼 아래의 함수 헤더를 살펴보겠습니다.

void add (int a, int b)

추가 기능의 서명을 참조하십시오. 여기서 ab는 공식 매개변수입니다.

add 함수에 대한 호출을 참조하십시오.

int result = add(2, 5);

함수 호출 내에서 25는 함수로 전송되는 인수인 반면 ab 함수 add의 형식 매개변수는 이러한 값을 수신합니다. 공식 매개변수 외에도 abadd 기능의 지역 변수이기도 합니다.

다른 지역 변수와 형식 매개변수의 차이점은 형식 매개변수는 함수가 호출될 때마다 함수 외부에서 값을 받는다는 것입니다. 그러나 다른 지역 변수는 함수 외부에서 값을 받을 수 없습니다.

다른 코드 보기:

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

이 코드 예제에는 두 개의 형식 매개변수(즉, ab)와 세 개의 로컬 변수(즉, result, ab )가 있습니다. add 기능 내에서 세 변수를 모두 유사하게 사용할 수 있습니다.

이러한 변수에 입력을 받고 일부 상수 값이나 변수를 할당하고 표현식에 사용할 수 있습니다.

형식 매개변수에 대한 아이디어를 얻은 후 이제 형식 매개변수의 재정의 문제에 대해 이야기하겠습니다.

C++에서 형식 매개변수의 재정의

C++ 프로그래머라면 같은 범위에 같은 이름을 가진 두 개의 변수가 있을 수 없다는 생각이 있어야 합니다. 예를 들어, 같은 이름의 전역 변수를 선언할 수 없습니다(유형은 중요하지 않음).

같은 클래스에서 같은 이름의 데이터 멤버를 선언할 수 없습니다. 마찬가지로 동일한 이름의 두 지역 변수를 선언할 수 없습니다.

더 잘 이해하기 위해 다음 예를 살펴보겠습니다.

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;

메시지는 다를 수 있지만 문제는 동일합니다. 즉, 동일한 이름의 변수 두 개가 동일한 범위에 존재할 수 없습니다. 그러나 다른 범위에서 동일한 이름 변수를 가질 수 있습니다.

예를 들어 아래 코드는 오류 없이 컴파일됩니다.

#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문은 3인 로컬 변수 a의 값을 인쇄합니다.

함수 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의 지역 변수입니다. 결과적으로 컴파일러 오류 'int x'의 선언이 매개변수를 숨깁니다를 볼 수 있습니다. 이는 지역 변수와 공식 매개변수의 이름이 같다는 것을 의미합니다.

요컨대, C++ 프로그래머는 형식 매개변수와 유사한 이름을 가진 지역 변수를 선언하지 않도록 주의해야 합니다. 그렇지 않으면 컴파일러가 이들을 구분하지 않고 오류를 생성합니다.

관련 문장 - C++ Function