1.
int Add (int a, int b = 3);
int Add (int a, int b)
{
}
2.
int Add (int a, int b);
int Add (int a, int b = 3)
{
}
두 작품 모두; 표준 방법은 무엇 이며 왜 그렇 습니까?
답변
선언을 헤더 파일에 넣고 정의를 별도의 .cpp
파일 에 넣고 다른 파일 의 헤더를 넣으면 #include
차이 .cpp
를 볼 수 있습니다.
구체적으로 다음과 같이 가정하십시오.
lib.h
int Add(int a, int b);
lib.cpp
int Add(int a, int b = 3) {
...
}
test.cpp
#include "lib.h"
int main() {
Add(4);
}
컴파일 test.cpp
하면 기본 매개 변수 선언이 표시되지 않으며 오류와 함께 실패합니다.
이러한 이유로 기본 매개 변수 정의는 일반적으로 함수 선언에 지정됩니다 .
lib.h
int Add(int a, int b = 3);
답변
C ++에서 매개 변수 목록에서의 위치와 관련하여 기본 인수에 부과 된 요구 사항은 다음과 같습니다.
-
주어진 매개 변수의 기본 인수는 한 번만 지정해야합니다. 동일한 기본값으로 두 번 이상 지정하면 불법입니다.
-
기본 인수가있는 매개 변수는 매개 변수 목록의 끝에 연속 그룹을 형성해야합니다.
이제 C ++에서는 위의 요구 사항이 지속적으로 충족되는 한 함수 선언에서 다음 인수로 기본 인수를 갖는 매개 변수 집합을 “성장”할 수 있습니다.
예를 들어, 기본 인수없이 함수를 선언 할 수 있습니다
void foo(int a, int b);
이러한 선언 후 해당 함수를 호출하려면 두 인수를 명시 적으로 지정해야합니다.
동일한 번역 단위에서 나중에 (뒤로) 다시 선언 할 수 있지만 이번에는 하나의 기본 인수로 다시 선언 할 수 있습니다.
void foo(int a, int b = 5);
이 시점에서 하나의 명시 적 인수로 호출 할 수 있습니다.
더 나아가서 다시 한 번 더 기본 인수를 추가하여 다시 선언 할 수 있습니다
void foo(int a = 1, int b);
이 시점에서 명시적인 인수없이 호출 할 수 있습니다.
전체 예는 다음과 같습니다.
void foo(int a, int b);
int main()
{
foo(2, 3);
void foo(int a, int b = 5); // redeclare
foo(8); // OK, calls `foo(8, 5)`
void foo(int a = 1, int b); // redeclare again
foo(); // OK, calls `foo(1, 5)`
}
void foo(int a, int b)
{
// ...
}
귀하의 질문에 대한 코드는 두 변종이 완벽하게 유효하지만 다른 의미를 갖습니다. 첫 번째 변형은 두 번째 매개 변수에 대한 기본 인수를 즉시 선언합니다. 두 번째 변형은 초기에 기본 인수없이 함수를 선언 한 다음 두 번째 매개 변수에 대해 하나를 추가합니다.
두 선언의 순 효과 (즉, 두 번째 선언 다음에 나오는 코드에서 보는 방식)는 정확히 동일합니다. 함수에는 두 번째 매개 변수에 대한 기본 인수가 있습니다. 그러나 첫 번째 선언과 두 번째 선언 사이에 일부 코드를 압축하면이 두 변형이 다르게 작동합니다. 두 번째 변형에서 함수에는 선언 사이에 기본 인수가 없으므로 두 인수를 명시 적으로 지정해야합니다.
답변
첫 번째 방법은 두 번째 방법보다 선호됩니다.
헤더 파일은 매개 변수가 선택적이며 기본값이 무엇인지 표시하기 때문입니다. 또한 해당 .cpp 파일의 구현에 관계없이 기본값이 동일하게됩니다.
두 번째 방법으로, 두 번째 매개 변수에 대한 기본값을 보장하지 않습니다. 해당 .cpp 파일이 구현되는 방법에 따라 기본값이 변경 될 수 있습니다.
답변
기본 인수는 일반적으로 함수 프로토 타입에서 함수 이름이 처음 나타날 때 지정해야합니다. 함수 정의가 프로토 타입으로도 사용되므로 함수 프로토 타입이 생략 된 경우 함수 인수에 기본 인수를 지정해야합니다.