형식 매개변수의 C++ 재정의
이 튜토리얼에서는 C++의 형식 매개변수 재정의 문제에 대해 논의합니다.
먼저 함수 정의 및 형식 매개변수에 대해 설명합니다. 다음으로 형식 매개변수의 재정의 문제를 다룰 것입니다.
C++의 함수 정의
프로그래밍에서는 매개변수와 인수가 번갈아 사용됩니다. 그러나 형식적으로는 차이점이 거의 없습니다.
매개 변수는 함수 헤더의 서명에서 함수 이름 뒤에 오는 괄호 안에 작성됩니다. 인수는 함수 호출과 함께 전송되는 값입니다.
참고: 때로는 인수를 매개변수라고 하고 매개변수를 형식 매개변수라고 합니다.
더 논의하기 전에 이 용어를 명확히 하는 것이 중요합니다. 그럼 아래의 함수 헤더를 살펴보겠습니다.
void add (int a, int b)
추가
기능의 서명을 참조하십시오. 여기서 a
와 b
는 공식 매개변수입니다.
add
함수에 대한 호출을 참조하십시오.
int result = add(2, 5);
함수 호출 내에서 2
및 5
는 함수로 전송되는 인수인 반면 a
및 b
함수 add
의 형식 매개변수는 이러한 값을 수신합니다. 공식 매개변수 외에도 a
및 b
는 add
기능의 지역 변수이기도 합니다.
다른 지역 변수와 형식 매개변수의 차이점은 형식 매개변수는 함수가 호출될 때마다 함수 외부에서 값을 받는다는 것입니다. 그러나 다른 지역 변수는 함수 외부에서 값을 받을 수 없습니다.
다른 코드 보기:
void add(int a, int b) {
int result = a + b;
cout << "Result: " << result << '\n';
}
add(2, 5);
이 코드 예제에는 두 개의 형식 매개변수(즉, a
및 b
)와 세 개의 로컬 변수(즉, result
, a
및 b
)가 있습니다. 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++ 프로그래머는 형식 매개변수와 유사한 이름을 가진 지역 변수를 선언하지 않도록 주의해야 합니다. 그렇지 않으면 컴파일러가 이들을 구분하지 않고 오류를 생성합니다.