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