C++ 함수에는 '디폴트 값'이라는 것을 설정할 수 있다.
'디폴트 값' : 기본적으로 설정되어 있는 값
매개변수에 설정하는 '디폴트 값'의 의미
다음의 형태로 선언 가능
#include <iostream>
int func1(int num = 7)
{
return num + 1;
}
int func2(int num1 = 5, int num2 = 7)
{
return num1 + num2;
}
func1의 int num = 7의 의미는
"함수호출 시 인자를 전달하지 않으면 7이 전달된 것으로 간주하겠다."
따라서 다음 두 호출문은 완전히 동일
func1(); // 7이 전달된 것으로 간주!
func1(7);
func2도 위와 같은 방식으로 동작
예시
#include <iostream>
int Adder(int num1 = 1, int num2 = 2)
{
return num1 + num2;
}
int main() {
std::cout << Adder() << std::endl;
std::cout << Adder(5) << std::endl;
std::cout << Adder(3,5) << std::endl;
return 0;
}
Adder(5)를 보면 알겠지만 "매개변수에 디폴트 값이 설정되어 있으면, 선언된 매개변수의 수보다 적은 수의 인자전달이 가능하다. 그리고 전달된 인자는 왼쪽에서부터 채워져 나가고, 부족한 부분은 디폴트 값으로 채워진다."
디폴트 값은 함수의 선언 부분에만 표현하면 됨
함수의 원형을 별도로 선언하는 경우, 매개변수의 디폴트 값은 함수의 원형 선언에만 위치시켜야 한다.
#include <iostream>
int Adder(int num1 = 1, int num2 = 2);
int main() {
std::cout << Adder() << std::endl;
std::cout << Adder(5) << std::endl;
std::cout << Adder(3,5) << std::endl;
return 0;
}
int Adder(int num1, int num2) // 원형에 디폴트 값이 선언되었기 때문에 정의 부분에 생략
{
return num1 + num2;
}
함수의 선언이 별도로 필요한 경우에는 매개변수의 디폴트 값은 함수의 선언부분에만 위치시켜야 한다.
부분적 디폴트 값 설정
다음과 같이 정의된 함수가 있다고 가정
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){....}
반드시 오른쪽 매개변수의 디폴트 값을 비우는 형태로 정의해야 한다.
int func(int num1, int num2, int num3=30){....}
int func(int num1, int num2=5, int num3=30){....}
int func(int num1=3, int num2=5, int num3=30){....}
그렇다면 오른쪽부터 채워지는 이유는?
"함수에 전달되는 인자가 왼쪽에서부터 오른쪽으로 채워지기 때문"
#include <iostream>
int boxvolume(int length, int width = 1, int height = 1);
int main(void)
{
std::cout << "[3, 3, 3] : " << boxvolume(3, 3, 3) << std::endl;
std::cout << "[5, 5, 3] : " << boxvolume(5, 5) << std::endl;
std::cout << "[7, 3, 3] : " << boxvolume(7) << std::endl;
//std::cout << "[D, D, D] : " << boxvolume() << std::endl; // 컴파일 에러
}
int boxvolume(int length, int width, int height)
{
return length * width * height;
}
참고 : [윤성우 열혈 C++ 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.