C++ 디폴트 매개변수에 대해서 알아보자
매개변수가 있는 함수 호출 시 C에서는 반드시 매개변수를 넘겨줘야 하지만 C++에서는 디폴트 매개변수라는 것이 있다.
#include <iostream>
using namespace std;
int TestFunc(int num = 10)
{
return num;
}
int main()
{
cout << TestFunc() << endl; //디폴트 값 적용
cout << TestFunc(20) << endl;
return 0;
}
TestFunc() 함수는 int 매개변수를 가지지만 int num = 10처럼 매개변수의 초깃값을 기술할 수 있다.
결과값 :
10
20
또한, 매개변수가 두 개 이상일 때도 가능하다. 하지만, 디폴트 매개변수 사용 시 주의해야 할 사항이 있다.
1. 피호출자 함수 매개변수의 디폴트 값은 반드시 오른쪽 매개변수부터 기술해야 한다.(함수 호출 시 매개변수가 왼쪽부터 적용되기 때문!)
2. 3개 이상의 매개변수 기술 시 디폴트 값이 중간에 빠지면 안 된다.
#include <iostream>
using namespace std;
int TestFunc(int num1 = 10, int num2 = 20)
{
return num1 + num2;
}
int main()
{
cout << TestFunc() << endl; //디폴트 값 적용
cout << TestFunc(20) << endl;
return 0;
}
이렇게 피호출자 함수 매개변수의 디폴트 값을 모두 기술하면 TestFunc(20)으로 함수를 호출하면 왼쪽부터 적용되어 int num1 = 20 이 된다.
결과값 :
30
40
이런 동작원리에 의해 피호출자 함수의 매개변수를 왼쪽부터 기술하면 에러가 발생한다.
#include <iostream>
using namespace std;
int TestFunc(int num1 = 10, int num2) //에러
{
return num1 + num2;
}
int main()
{
cout << TestFunc(20) << endl;
return 0;
}
결과값 :
오류(활성) E0306 기본 인수가 매개 변수 목록의 끝에 없습니다.
오류 C2548 'TestFunc': 매개 변수 2의 기본 인수가 없습니다.
오류(활성) E0165 함수 호출에 인수가 너무 적습니다.
마찬가지로, 디폴트 매개변수 값이 중간에 빠져도 에러가 발생한다.
int TestFunc(int num1 = 10, int num2, int num3 = 30) //에러
{
return num1 + num2 + num3;
}
int main()
{
cout << TestFunc(20) << endl; //에러
return 0;
}
피호출자 함수 오른쪽 매개변수부터 기술하면 정상적으로 컴파일된다.
#include <iostream>
using namespace std;
int TestFunc(int num1, int num2 = 20, int num3 = 30)
{
return num1 + num2 + num3;
}
int main()
{
cout << TestFunc(10) << endl; //10이 num1으로 적용된다.
return 0;
}
결과값 :
60
마지막으로, 함수의 원형을 선언할 때입니다. 함수 원형 선언 시 디폴트 매개변수를 기술해주면 된다.
#include <iostream>
using namespace std;
int TestFunc(int num1, int num2 = 20);
int main()
{
cout << TestFunc(20) << endl; //20이 num1으로 들어간다.
return 0;
}
int TestFunc(int num1, int num2)
{
return num1 + num2;
}
결과값 :
40
C++ 디폴트 매개변수는 가급적 사용하지 않는 것이 좋다고 한다. 그 이유는 C와 다르게 C++에서는 함수의 다중 정의를 지원하는데, 함수 호출 부분만 보고서 함수의 원형을 알 수 없기 때문이다. 즉, 함수가 모호성의 성질을 가질 수 있는데 이는 코드 해석과 이해하는데 방해 요소가 되기 때문이다.
'C++' 카테고리의 다른 글
[C++] 참조자(Reference) (0) | 2019.12.16 |
---|---|
[C++] this 포인터 (0) | 2019.12.15 |
[C++] 클래스와 메소드 (0) | 2019.12.15 |
[C++] 네임스페이스(Namespace) (0) | 2019.12.14 |
[C++] 오버로딩(Overloading)과 템플릿(Template) (0) | 2019.12.13 |