default_arguments — 기본 인자

default_arguments — 기본 인자 (Default arguments)

**기본 인자(default argument)**는 함수를 호출할 때 뒤쪽의 인자 하나 이상을 생략해도 되게 해주는 기능이에요. 함수 선언의 매개변수 목록에서 특정 매개변수에 기본값을 지정해요.

함수 호출에서 빠진 뒤쪽 인자 자리에 기본 인자가 사용돼요.

출처: cppreference

본문

기본 인자 표기 문법은 다음과 같아요.

attr decl-specifier-seq declarator = initializer     // (1)
attr decl-specifier-seq abstract-declarator = initializer  // (2)

오직 뒤쪽에 있는 매개변수만 기본 인자를 가질 수 있어요. 앞쪽 매개변수에만 기본 인자를 주면 오류예요.

int x(int = 1, int); // 오류: 뒤쪽 매개변수만 기본 인자를 가질 수 있음
                     //      ("x"에 대한 앞선 선언이 없다고 가정)

void f(int n, int k = 1);
void f(int n = 0, int k); // OK: "k"의 기본 인자는 같은 범위의
                          // 이전 선언에서 제공됨

void g(int, int = 7);

void h()
{
    void g(int = 1, int); // 오류: 같은 범위가 아님
}

C++11부터, 매개변수가 **매개변수 팩(parameter pack)**에서 확장된 경우에는 예외예요.

template<class... T>
void h(int i = 0, T... args); // OK

줄임표(ellipsis)는 매개변수가 아니므로 기본 인자를 가진 매개변수 뒤에 올 수 있어요.

기본 인자는 특정 제약도 있어요.

  • 함수 선언(및 람다 표현식)에만 사용할 수 있고, 함수 포인터나 함수 참조의 선언, 또는 typedef 선언에서는 허용되지 않아요.
  • 기본 인자는 한 번(같은 범위에서)만 지정할 수 있어요.
  • 기본 인자 안의 이름은 선언 시점에 조회돼요.
  • 기본 인자로 사용된 지역 변수는 아직 존재하지 않을 수 있으므로 주의가 필요해요.
int a = 1;
void f(int n = a); // OK: 전역 a 사용

기본 인자를 잘 쓰면 호출 코드가 짧아지고, "보통은 이 값을 쓰면 돼요" 같은 합리적인 기본 동작을 제공할 수 있어요.

더 알아보기 (Learn more)

cppreference