기능 매개 변수의 기본값 a, int b) { } 2. int Add

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 ++에서 매개 변수 목록에서의 위치와 관련하여 기본 인수에 부과 된 요구 사항은 다음과 같습니다.

  1. 주어진 매개 변수의 기본 인수는 한 번만 지정해야합니다. 동일한 기본값으로 두 번 이상 지정하면 불법입니다.

  2. 기본 인수가있는 매개 변수는 매개 변수 목록의 끝에 연속 그룹을 형성해야합니다.

이제 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 파일이 구현되는 방법에 따라 기본값이 변경 될 수 있습니다.


답변

기본 인수는 일반적으로 함수 프로토 타입에서 함수 이름이 처음 나타날 때 지정해야합니다. 함수 정의가 프로토 타입으로도 사용되므로 함수 프로토 타입이 생략 된 경우 함수 인수에 기본 인수를 지정해야합니다.


답변