본문 바로가기

C++

[C++] 디폴트 매개변수

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