'디폴트 값'이란 말 그대로 '기본적으로 설정되어 있는 값'을 의미한다.
그럼, 예를 보자.
int FuncOne(int num = 7)
{
return num+1;
}
int FuncTwo(int num1 = 5, int num2 = 7)
{
returnn num1+num2;
}
FuncOne의 매개변수 선언이 다음과 같다.
int num = 7
그리고 이는 다음의 의미를 가진다.
"함수 호출 시 인자를 전달하지 않으면 7이 전달된 것으로 간주한다."
따라서 다음 두 함수 호출 문은 완전히 동일하다.
FuncOne();
FuncOne(7);
이어서, FuncTwo를 보면..
int num1 = 5, int num2 = 7
또한 이는 다음의 의미를 가진다.
"함수 호출 시 인자를 전달하지 않으면 num1에 5, num2에 7이 전달된 것으로 간주한다."
따라서 다음 두 함수 호출 문도 동일하게 된다.
FuncTwo();
FuncTwo(5, 7);
그럼 다음 예제를 살펴보자
보면 순서대로 3, 7, 8가 출력된 것을 확인할 수 있다.
또한 추가적으로 다음 사실도 알 수 있다.
"매개변수에 디폴드 값이 설정되어 있으면, 선언된 매개변수의 수보다 적은 수의 인자 전달이 가능하다.
그리고 전달되는 인자는 왼쪽부터 채워져 나가고, 부족한 부분은 디폴트 값으로 채워진다."
그렇다면 부분적으로 디폴트 값을 설정 할 수 있지 않을까??
일단 다음과 같은 함수가 있다고 가정하자.
int Func(int num1, int num2, int num3) { ... }
이런 경우에, 다음과 같이 디폴트 값을 전부 지정할 수도 있지만..
int Func(int num1 = 3, int num2 = 5, int num3 = 7) { ... }
다음과 같이 일부만 디폴트 값을 지정할 수도 있다.
int Func(int num1, int num2 = 5, int num3 = 7) { ... }
그럼, 다음의 형태로도 함수 호출이 가능하게 된다.
Func(10); // Func(10, 5, 7)
Func(10, 20); // Func(10, 20, 7)
하지만, 다음과 같이 오른쪽 매개변수의 디폴트 값을 비우는 형태로는 디폴트 값을 지정할 수 없다.
int Func(int num1 = 3, int num2 = 5, int num3) { ... }
* num3은 디폴트 값이 비워져있다.
반드시 오른쪽 매개변수의 디폴트 값부터 채우는 형태로 정의해야 한다. 즉, 다음과 같은 형태는 모두 가능하다.
int Func(int num1, int num2, int num3 = 7) { ... }
int Func(int num1, int num2 = 5, int num3 = 7) { ... }
int Func(int num1 = 3, int num2 = 5, int num3 = 7) { ... }
반면 다음과 같은 형태는 모두 불가능하다.
int Func(int num1 = 3, int num2, int num3) { ... }
int Func(int num1 = 3, int num2 = 5, int num3) { ... }
왜 반드시 오른쪽부터 채울 것을 요구하는 이유가 무엇일까?
반대로 생각하면 쉽게 알 수 있다.
"함수에 전달되는 인자가 왼쪽에서 오른쪽으로 채워지기 때문이다."
다음과 같은 특성 때문에 반드시 오른쪽부터 채워야 한다.
추가로는..
다음과 같이 함수의 원형을 별도로 선언하는 경우,
"매개변수의 디폴트 값은 함수의 원형 선언에만 위치시켜야 한다."
이유는 쉽다. 만약에 디폴트 값의 선언이 함수의 원형에 위치하지 않는다면,
9행과 10행이 컴파일이 불가능하기 때문이다.
'스터디 > C++' 카테고리의 다른 글
[ C++ ] Call-by-value , Call-by-reference (0) | 2019.09.05 |
---|---|
[ C++ ] const ( 상수 )의 활용 (0) | 2019.09.05 |
[ C++ ] 인라인(inline) 함수 (0) | 2019.09.05 |
[ C++ ] 선행처리기 / 전처리기 ( Preprocess ) (0) | 2019.09.05 |
[ C++ ] 함수 오버로딩 ( Function Overloading ) (0) | 2019.09.05 |